本次招新赛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");
}
}
1007

被折叠的 条评论
为什么被折叠?



