2019年全国高校计算机能力挑战赛初赛C语言解答
http://www.ncccu.org.cn
2019年全国高校计算机能力挑战赛分设大数据算法赛,人工智能算法赛,Office高级应用赛,程序设计赛4大赛项
C语言初赛解答
1:编程1
16.现有一个数字闹钟(时间采用24时制)。已知当前时间和预订的闹钟时间(全部为整点时间),请你帮忙计算,几小时后闹钟会响。
输入说明:每个输入有ct和tt,ct是当前时间,t是预定的闹铃时间。
输出说明:距离闹钟响起的时间。
输入样例:22 5
输出样例:7
代码提交说明:
1.请严格按照每道题目给出的输入/输出样例编写相关I/O代码,数字间的默认间隔是一个空格,浮点数的默认输出精度是保持小数点后2位。样例以外的提示信息请不要在屏幕上输出。
2.请大家确保提交的代码可以在指定的编译条件下正确地编译执行,否则自动评测程序将给出编译错误或运行时错误的信息。
3.每道编程题目,如果没有特殊说明,需要在1秒内完成程序的运行和输出结果,超过这个时间限制将会被判超时,失去相应测试用例的分数。每个可执行文件可使用的空间不得大于1MB。
4.每道编程题会有多个测试用例,每通过一些测试用例可以获得相应的分值,但只有通过全部测试用例才能拿到这题全部的分
#include <stdio.h> int main(){ int st,et; int i,res=0; scanf("%d",&st); scanf("%d",&et); if(et<st){ for(i=st;i<24;i++){ res++; } for(i=0;i<et;i++){ res++; } }else{ for(i=st;i<et;i++){ res++; } } printf("%d",res); return 0; }
2:编程2
17.输入正整数N和M(O<N<M<=100000),请输出N到M(含N和M)之间不能被3或11整除但可以被5整除的数的个数。
输入说明:输入两个正整数N和M。输出说明:统计满足条件数的个数。
输入样例:40 50
输出样例:1
#include <stdio.h> #include <stdlib.h> int main(){ int n,m; int i,res=0; scanf("%d%d",&n,&m); for(i=n;i<=m;i++){ if((i%3!=0&&i%11!=0)){ continue; } if(i%5==0){ res++; } } printf("%d",res); return 0; }
3:编程3
18.在体操比赛中,每位选手的得分是由多名裁判综合打分所得。现在已经汇总了N名选手的个人总得分
(选手的编号依次为1,2,……N),请你设计程序找出第K名选手在所有选手中的排名。
输入说明:第一行是N和K,N表示运动员的个数,K是选手序号;第二行依次是这N位运动员的个人总得分。
输出说明:第K名(从1开始)选手在所有选手中的排名。
输入样例1:6 4
500 450 460 480 510 530
输出样例1:4
输入样例2: 6 2
500 490 490 490 490 530
输出样例2:3
#include <stdio.h> #include <stdlib.h> int a[1000000]; int cmp(const void *a,const void *b) { return *(int *)b-*(int *)a; } int main(){ int n,m,dest=0; int i,res=0; scanf("%d%d",&n,&m); for(i=0;i<n;i++){ scanf("%d",&a[i]); } dest=a[m-1]; qsort(a,n,sizeof(a[0]),cmp); for(i=0;i<n;i++){ if(a[i]==dest){ printf("%d",i+1); break; } } return 0; }
4:编程4
19.假设以某个雷达站所在位置为基点,坐标记为(0,0),侦察半径是R千米。现有N个运动物体坐标(单位是干米),请计算有多少个运动物体会被雷达侦测到。
输入说明:第一行是两个数N和R,分别表示运动物体的个数和侦察半径。接下来是N行分别输入运动物体的坐标(XY)。
输出说明:N个运动物体中能够被雷达发现的个数。
输入样例:5 30
10 25
18 12
19 10
20 25
21 22
输出样例:3
#include <stdio.h> #include <stdlib.h> int main(){ int n,m,dest=0; int i,res=0,x,y; scanf("%d%d",&n,&m); for(i=0;i<n;i++){ scanf("%d%d",&x,&y); dest = sqrt(x*x+y*y); if(dest<m){ res++; } } printf("%d",res); return 0; }
5:编程5
因部分同学反应比赛刚开始时间网页较卡顿,现统一延长比赛时间至17:10,特此公告!
20.给出N(N<1000)个整数,用它们构建一个二叉排序树。请给出元素K是其双亲节点的左子树还是右子树。
输入说明:第一行输入N和K,第二行输入N个整数。
输出说明:如果是左子树输出Left child,如果是右子树输出Right child
输入样例:7 6
12 15 11 8 6 10 3
输出样例:Right child
#include <stdio.h> #include <stdlib.h> struct TNode{ int data; struct TNode *lt; struct TNode *rt; }; struct TNode* insrtTree(struct TNode *t,int key,int i); int arr[1000]={0}; int main(){ int n,m; int i,t; scanf("%d%d",&n,&m); struct TNode *root=NULL; for(i=0;i<n;i++){ scanf("%d",&arr[i]); root=insrtTree(root,arr[i],i); } if(arr[m-1]==0){ printf("Right child"); }else{ printf("Light child"); } return 0; } struct TNode* insrtTree(struct TNode *t,int key,int i){ if(t==NULL){ t=(struct TNode*)malloc(sizeof(struct TNode)); t->lt=t->rt=NULL; t->data=key; return t; } if(t->data>key){ arr[i]=1; t->lt=insrtTree(t->lt,key,i); }else{ arr[i]=0; t->rt=insrtTree(t->rt,key,i); } return t; }
结果: