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; }
結果: