用户登录
用户注册

分享至

CSUST 2020国庆新生有奖赛题解

  • 作者: 隔壁老王独霸后宫
  • 来源: 51数据库
  • 2021-07-28

前言:先为20级萌新们惨遭学长学姐毒手感到不幸,其次希望这次没发挥好的萌新也不要气馁,后面好好学算法,肯定有机会的(毒瘤会长说的 )。

A题: zw吃外卖 (此处先殴打出题人)
题解: 签到题,奇数就输出YES,偶数就输出NO
代码:

#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    if(n%2==1)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
}

B题: lcj的烦恼
题解: 签到题,原价x元,微信打完折就是x*0.98元

#include<cstdio>
int main()
{
  	int x;
  	scanf("%d",&x);
    double ans=x*0.98;
    printf("%.2lf\n",ans);
}

C题: a+b
题解: 签到题, 题目虽然有点长,但都是废话(毒瘤的会长也好心把题目的关键语句加粗了),其实只要判断两个颜色的R值,B值,G值分别相加是否都等于255即可。

#include<stdio.h>
int main()
{
    int n1,k1,x1;
    int n2,k2,x2;
    scanf("%d%d%d",&n1,&k1,&x1);
    scanf("%d%d%d",&n2,&k2,&x2);
    if(n1+n2==255&&k1+k2==255&&x2+x1==255)
    {
        printf("yes\n");
    }
    else
    {
        printf("no\n");
    }
    return 0;
}

D题: zw抢苹果(此处再次殴打出题人)
毒瘤出题人中文四级没过,题面各种锅,提供滴滴代打。
题解: 第一次拿的是第一组,第二次是在剩下的组中拿第二组,即取的是一开始的第三组,以此类推,易知取的是1 3 5 7 …组,那么剩下的全是偶数组,2,4,6,8 …,那么剩下的第k组的编号便是 2k,因此答案便是第2k组的苹果数量,若2*k>n,则无答案。
代码:

#include<cstdio>
int main()
{
    int n,k,x;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(i==2*k)
        {
            printf("%d\n",x);
        }
    }
    if(n<2*k)
    {
        printf("-1\n");
    }
}

E题: 一直单身一直爽
题解: 先算出有多少个1,再判断是否存在连续k个1,怎么判断呢?
用 cnt去记录当前有多少个连续的1,依次遍历数组的每个元素,若值为1,则cnt++,若为0,则cnt=0, 若在某个位置上cnt>=k,则表示存在连续k个1,则输出无穷大,反之输出 1的个数 * x
代码:

#include<cstdio>
int main()
{
    int n,x,k,y;
    scanf("%d%d%d",&n,&x,&k);
    int cnt=0,flag=0,res=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&y);
        cnt+=y;
        if(y==1) res++;
        else res=0;
        if(res==k) flag=1;
    }
    if(flag) printf("inf\n");
    else printf("%d\n",cnt*x);
}

F题: 神奇的青青草原
题解: 假如只有一只狼,那么灰太狼必定会去吃懒羊羊,因为他肯定不会被其他狼吃掉,假如有两只狼,不管哪只狼去吃羊,他必会被另一只狼吃掉,所以狼都不会去吃羊,假如有三只狼,如果灰太狼吃懒羊羊的话,情况就会回到两狼一羊的情况,剩下两只狼都不敢去吃,所以灰太狼能吃羊,以此类推,可以发现,狼为偶数的时候,不能吃羊,狼为奇数的时候可以吃羊。
代码:

#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    if(n%2==1)
    {
        printf("nice");
    }
    else
    {
        printf("555");
    }
}

G题: dl的会长(会长确实是个毒瘤)
题解: 此题其实就是找四个数的第二大和第三大的数之间任意的数。原因:当只有两个数时,如果选择两个数之外的数,那么花费必定大于b-a,如果选两个数之间的任意数,那么花费就是b-a,同理四个数也是一样。要么直接用sort函数排个序,要么枚举4个数其中一个数为第二大或第三大,维护答案的最小值。因为不是第二大和第三大的数之间的数,算出来的答案肯定比最优解要大,所以是取最小值,第二种方法的时候记得要用long long,否则会爆int。
代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[10],ans = 2e9,sum;
int main(){
    for(int i = 1; i <= 4; i ++){
       scanf("%d",&a[i]);
    }
    for(int i = 1; i <= 4; i ++){
       sum = 0;
       for(int j = 1; j <= 4; j ++){
           sum = (sum + abs(a[j] - a[i]));
       }
       ans = min(ans , sum);
   }
   printf("%lld",ans);
}
软件
前端设计
程序设计
Java相关