Fork me on Gitee

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;
}

结果:

 

 

 

posted @ 2019-11-16 22:37  ---dgw博客  阅读(4386)  评论(3编辑  收藏  举报