ACM第一次招新赛

本次招新赛A,D,E,G四道题属于简单题,B,C两道属于中等题,F一道属于难题。

虽然有简单题,但是简单题还是有卡通过的一些数据,大部分都是常见卡数据方式,例如卡double,卡longlong,所以该次比赛之后需要在做题时仔细观察数据范围,以判断是否会卡数据。

A.输出"Hello World"(Easy)

该题较为简单,但是会卡double,需要在计算平均数时利用double计算,如果利用整数计算平均数,会存在小数下取整的情况,导致计算错误。

#include<stdio.h>
int main()
{
    int a,b,c,d,e;
    scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
    double res=0;//利用double,习惯用double,float精度比较低
    res=(a+b+c+d+e)*1.0/5;//*1.0是为了将整形数据存储改为浮点型数据存储
    if(e>=res)printf("Hello World");
    else printf("菜就多练");
    return 0;
}

B.输出"Hello World"(Hard)

该题是A题的升级版,同样的问题,也是需要利用double计算平均数,该题主要提升在需要借助循环,将多名学生的判断结果输出,学过循环的其实很快就能解出来,没学过的话进度稍微慢了一点。

#include<stdio.h>
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    while(n--)//循环n名学生
    {
        double res=0;
        int b=0;
        for(int i=0;i<m;i++)//循环每名学生的m门科目
        {
            int a;
            scanf("%d",&a);
            res+=a;
            if(i==m-1)b=a;//将最后一门c语言成绩储存起来,用于后续判断
        }
        res=res/m;
        if(b>=res)printf("Hello World\n");
        else printf("菜就多练\n");
    }
    return 0;
}

C.签到题?

该题本质上就是一个循环键入字符的过程,学过数组的这题做起来应该较为简单,一个字符串60位的长度,想利用long long将其当做整形输入,再位数分离显然是行不通的,所以需要循环键入字符,首先数据中会给出字符串的长度,所以利用该长度就可以,不断循环键入字符,然后利用二进制转换十进制的方法即可转换成十进制。

#include<stdio.h>
#include<math.h>
int main()
{
    int n;
    scanf("%d",&n);
    getchar();//将换行符读入,否则会影响后续处理字符串
    long long res=0;//字符串的长度达到了60,肯定会超过int的范围
    int k=n-1;//2进制转换成十进制,最高位是2的n-1次方
    while(n--)//循环键入字符
    {
        char c;
        scanf("%c",&c);
        long long p=(c-'0')*pow(2,k);//计算出来每一位的值
        res+=p;
        k--;
    }
    printf("%lld",res);
    return 0;
}

D.真签到题?

这是一道非常简单,属于真正的签到题 ,但是卡了一下int的范围,当int达到最大值时,再加1会出现溢出直接变为负数。但是该题有个小坑就是输出需要仔细看清楚(手动滑稽)。

#include<stdio.h>
int main()
{
    long long n;
    scanf("%lld",&n);
    n++;
    if(n>=10)printf("YE5");
    else printf("N0");
    return 0;
}

E.真真签到题?

跟F题差不多,都是卡了一个int的范围,然后直接输入,计算,输出即可

#include<stdio.h>
int main()
{
    long long v,m;
    scanf("%lld %lld",&v,&m);
    printf("%lld",v*v*m/2);
    return 0;
}

F.假签到题?

这道题还是有难度的,做不出来也正常,做出来了说明学的已经很不多了,继续努力就行。

这道题需要寻找最优解情况下的实力值,即求出最值。通过分析题目可以得知,最优解的情况下,隔一个人选一个,这样可以保证人数较多,但是这样就会出现两种情况就是,只挑奇数号的人和只挑偶数号的人,所以需要对这两种情况都计算一下,然后比较哪种情况能得到最大值,这样就能计算出来答案了。

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)//多组样例
    {
        int n;
        scanf("%d",&n);
        int x1=0,x2=0;
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            if(i%2!=0)//寻找只挑奇数号人中的最大值
            {
                if(a>=x1)x1=a;
            }
            else//寻找只挑偶数号人中的最大值
            {
                if(a>=x2)x2=a;
                
            }
        }
        int res1=x1+(n+1)/2;//奇数号人的最大值加上人数
        int res2=x2+n/2;//偶数号人的最大值加上人数
        if(res1>=res2)printf("%d\n",res1);//判断那个值更大
        else printf("%d\n",res2);
    }
    return 0;
}

G.真真假假签到题?

该题为简单题,首先将输入进去的数计算位数,然后等于二位数,再判断个位数和十位数是否相等即可

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)//多组样例
    {
        int n;
        scanf("%d",&n);
        int n1=n,k=0;
        while(n1!=0)//判断位数
        {
            n1/=10;
            k++;
        }
        if(k!=2)//不等于两位数就输出NO
        {
            printf("NO\n");
            continue;
        }
        int a=n%10;
        int b=n/10;
        if(a!=b)//等于两位数就判断个位数和十位数是否相等
        {
            printf("NO\n");
            continue;
        }
        printf("YES\n");
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值