平顶山学院ACM竞赛试题及答案.docx
《平顶山学院ACM竞赛试题及答案.docx》由会员分享,可在线阅读,更多相关《平顶山学院ACM竞赛试题及答案.docx(16页珍藏版)》请在冰豆网上搜索。
![平顶山学院ACM竞赛试题及答案.docx](https://file1.bdocx.com/fileroot1/2023-1/10/9fcae820-a442-43ea-86df-c213494368c8/9fcae820-a442-43ea-86df-c213494368c81.gif)
平顶山学院ACM竞赛试题及答案
以下三道题,作为本次ACM大赛选拔选手的试题。
请同学们按照要求完成程序,并对程序进行注释。
同时简要说明编程思路。
程序以电子邮件形式发到邮箱
计科院发送到赵凯老师的邮箱zacky@
软件学院发送到马飞老师的邮箱mafei0603@
请写明姓名、学号和班级,于5月5日以前提交。
【试题一】
灾区已经非常困难,灾民需要帐篷、衣物、食品和血浆。
可通往灾区的道路到处都是塌方,70%以上的路面损坏,桥梁全部被毁。
中国空军立即启动应急预案,展开史上最大强度非作战空运行动,准备向灾区空投急需物资。
由于余震不断,天气恶劣,怎样知道空投的物资是否落在某灾区的区域内?
经过空中观测,多数灾区为一圆形,空投的物资落在P(Xj,Yj)点。
你能否给出一个正确判断?
【标准输入】
第1行:
NM(N为灾区数,M为空投的物资数)
接下有N行:
Xi0Yi0Ri(Xi0,Yi0)为圆心坐标,Ri为圆半径i=1,2,….,N
接下有M行:
XjYij(Xj,Yj)为空投物资的坐标j=1,2,….,M)
【标准输出】
输出有M行,每一行输出YES(若物资落在某个圆上或圆内,输出YES
或NO否则输出NO)
【约束条件】
(1)1≤N≤32≤M≤10
(2)Ri是一个正整数Ri<=50i=1,2,….,N
(3)所有的圆心坐标和物资的坐标均为整数范围均在[-100,100]内
(4)时间限制:
1000MS
【样例】
标准输入标准输出
23
0020
-703050
1010
-3060
3030YES
YES
NO
【试题二】
据不完全统计,受地震影响,四川大部分灾区通信陷入瘫痪,数千个基站因断电、传输中断等原因退出服务,目前总公司已紧急部署对受灾地区进行通信抢修。
按照应急通信保障预案,必须尽快、付出代价最小,效率更高来全力恢复通信。
由于四川大部分灾区都处于山区,有很多基站之间不能直接建立通信。
现已知建立各基站之间直接通信的代价,问如何建立总代价最小的通信网,使得任意两个基站之间都能通信?
【标准输入】
第1行:
NM(N为基站数M为能直接建立通信关系数)
接下有M行:
IJP(每行有三个数。
IJ为基站的编号
P为基站I与基站之间直接通信的代价)
【标准输出】
T(建立通信网的最小代价数)
【约束条件】
(1)2≤N≤10010≤M≤1000
(2)0
(3)时间限制:
1000MS
【样例】
标准输入标准输出
57
12160
1330
1420
23200
3450
3580
5470280
【试题三】
密码破译
某组织欲破获一个外星人的密码,密码由一定长度的字串组成。
此组织拥有一些破译此密码的长度不同的钥匙,若两个钥匙的长度之和恰好为此密码的长度,则此密码被成功破译。
现在就请你编程找出能破译此密码的两个钥匙。
【标准输入】
第一行:
NN为钥匙的个数(1<=N<=1000)
第二行:
LL为密码的长度
以下有N行:
Ai每一行是一把钥匙的长度i=1,2,……,N
【标准输出】
若无法找到破译此密码的钥匙,则输出0
若找到两把破译的钥匙,则输出文件有两行,分别为两把钥匙的编号,按从小到大输出。
若有多种破译方案,则只输出包含起始编号最小的一组即可。
[【约束条件】
(1)1<=N,L,Ai<=1000(i=1,2,…..,N)
(2)时间限制:
1000MS
【样例】
标准输入标准输出
10
80
27
9
4
73
23
68
12
64
92
166
7
4.班级管理系统
#include
#include
intmain()
{
//intpan(inta,intb);
intn,m;
inta,b,c;
scanf("%d%d",&n,&m);//输入第一行;
intA[3],B[3],C[3],D[100]={0};//
for(inti=0;iscanf("%d%d%d",&A[i],&B[i],&C[i]);
for(intj=0;j{
scanf("%d%d",&a,&b);
for(intk=0;k{
if(-C[k]<(a-A[k]){
c=(A[k]-a)*(A[k]-a)+(B[k]-b)*(B[k]-b);
if(c>=C[k]*C[k])//c代表落点与中心距离的平方;
D[k]=1;//1代表YES
else
D[k]=0;
}
else
continue;
}
}
for(intl=0;lif(D[l]==1)
printf("YES\n");
else
printf("NO\n");
return0;
}
说明:
此题昨晚下了晚自习编的记不多清了,不过此题我编的有点字母过于多;思路就先判断到圆心
x的距离以减少计算按步骤;#include
intxiao(inta,intb)
{
if(b==0)
returna;
elseif(a>b)
returnb;
else
returna;
}
intmain()
{
intm,n,A=0,B=0,C,D,E;
intx,y,z;
inta[100][100]={0};
intb[100]={0};
intc[100]={0};//这个地方有点浪费空间,
scanf("%d%d",&n,&m);
for(inti=0;i{
scanf("%d%d%d",&x,&y,&z);
B=xiao(z,B);
if(y>x)
a[x-1][y-1]=z;
else
a[y-1][x-1]=z;
}
for(i=0;i{
for(intj=i;j{
if(a[i][j]==B&&E==1)
{
E=E+1;
break;
}
elseif((a[i][j]==0)||(&a[i][j]==a[i]))
continue;
else
{
C=a[i][j];
D=c[j];
c[j]=xiao(C,D);
D=c[i];
c[i]=xiao(C,D);
}
}
}
for(intk=0;k{
A=A+c[k];
printf("%d\n",A);
if(c[k]=0)
{
printf("不嫩全部连接");
break;
}
}
A=A-B;
printf("%d",A);
return0;
}
/*说明:
这道题我花了很长时间,刚开始想不起来,感觉题不那么容易,不过在没路的时候看了一下数据
发现了这个规律,不过这时也有一点错误,恰好提上带的数据不能发现,其他人用另外的数据告诉我错
的,结果主要是去了两行,有点笨,这道题就是每个点都有到的了,肯定还有一个重复的减去就可以了
;*/#include
intmain()
{
intN,L;
inta,b=0,c=0;
intA[1000];
scanf("%d",&N);
scanf("%d",&L);
for(inti=0;iscanf("%d",&A[i]);
for(intj=0;j{
a=L-A[j];
for(intk=j+1;k{
if(a==A[k])
{
b=j+1;
c=k+1;
break;
}
}
if(b!
=0)
break;
}
printf("\n%d%d",b,c);
}
说明:
此题比较简单;没什么好说的,就让从头开始每个与后面的挨个比较;#include
#include
#include
#include
structchengji
{
charyuwen[8];
charyingyu[8];
charshuoxue[8];
charzongfen[8];
};
structstudent
{
charname[20];
charnum[10];
structchengjifenshuo;
};
charfilename[10];
FILE*fp;
voidcreat();
voidoutput();
voidsearch();
voidappend();
voidmodify();
voiddeete();
voidmain()
{
intm;
creat();
while
(1)
{
printf("\n\n添加,请按1");
printf("\n查找,请按2");
printf("\n修改,请按3");
printf("\n删除,请按4");
printf("\n输出,请按5");
printf("\n退出,请按0\n");
scanf("%d",&m);
if(m>=0&&m<=5)
{
switch(m)
{
case1:
append();
break;
case2:
search();
break;
case3:
modify();
break;
case4:
deete();
break;
case5:
output();
break;
case0:
exit(0);
}
printf("\n\n操作完毕,请再次选择!
");
}
else
printf("\n\n选择错误,请重新选择!
");
}
}
voidcreat()
{
intsum=0;
structstudentone;
longs1;
printf("请输入班级名:
");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\n不能建立班级!
");
exit(0);
}
fprintf(fp,"%-21s%-11s%-9s%-9s%-9s%-9s\n","姓名","学号","语文","英语","数学","总分");
printf("\n请输入姓名,学号,(语文,英语,数学分数)(以0结束)\n");
scanf("%s",&one.name);
//fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","姓名","学号","语文","英语","数学","总分");
//fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","姓名",“学号“,”语文”,“英语","数学","总分”);fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","姓名",“学号“,”语文”,“英语","数学","总分”);fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","姓名",“学号“,”语文”,“英语","数学","总分”);fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","姓名",“学号“,”语文”,“英语","数学","总分”);fprintf(fp,"%-20s%-20s%-20s%-20s%-20s%-20s\n","姓名",“学号“,”语文”,“英语","数学","总分”);while(strcmp(one.name,"0"))
while(strcmp(one.name,"0"))
{
scanf("%s%d%d%d\n",one.num,&one.fenshuo.yuwen,&one.fenshuo.yingyu,&one.fenshuo.shuoxue);
sum=*one.fenshuo.yuwen+*one.fenshuo.yingyu/*+one.fenshuo.shuoxue*/;
fprintf(fp,"%-21s%-11s%-9d%-9d%-9d%-9d\n",one.name,one.num,*one.fenshuo.yuwen,*one.fenshuo.yingyu,*one.fenshuo.shuoxue,*sum);
scanf("%s",one.name);
}
fclose(fp);
}
voidoutput()
{
structstudentone;
if((fp=fopen(filename,"r"))==NULL)
{
printf("\n不能打开班级!
");
exit(0);
}
printf("\n\n%11s\n","班级");
while(!
feof(fp))
{
fscanf(fp,"%s%s%s%s%s%s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue,one.fenshuo.zongfen);
printf("%-21s%-11s%-9s%-9s%-9s%-9s",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue,one.fenshuo.zongfen);
}
fclose(fp);
}
voidappend()
{
intsum;
structstudentone;
if((fp=fopen(filename,"a"))==NULL)
{
printf("\n不能打开班级!
");
exit(0);
}
printf("\n请输入添加的姓名,学号,(语文,英语,数学分数)");
scanf("%s%s%s%s%s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue);
sum=*one.fenshuo.yuwen+*one.fenshuo.yingyu+*one.fenshuo.shuoxue;
fprintf(fp,"%-21s%-11s%-9s%-9s%-9s%-9s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue,sum);
fclose(fp);
printf("操作结束");
}
voidsearch()
{
intk=0;
charnamekey[20];
structstudentone;
printf("\n请输入性名:
");
scanf("%s",namekey);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("\n不能打开班级!
");
exit
(1);
}
//while(!
feop(fp))
while(!
feof(fp))
{
fscanf(fp,"%s%s%s%s%s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue);
if(!
strcmp(namekey,one.name))
{
printf("\n\n已查到,记录为:
");
printf("%-21s%-11s%-9s%-9s%-9s%-9s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue,one.fenshuo.zongfen);
k=1;
}
}
if(!
k)
printf("\n\n对不起,班级中没有此人记录。
");
fclose(fp);
}
voidmodify()
{
intm,k=0;
longoffset;
charnamekey[20];
structstudentone;
printf("\n请输入姓名:
");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开班级!
");
exit(0);
}
while(!
feof(fp))
{
offset=ftell(fp);
fscanf(fp,"%s%s%s%s%s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue);
if(!
strcmp(namekey,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n\n已查到,记录为:
");
printf("%-21s%-11s%-9s%-9s%-9s%-9s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue,one.fenshuo.zongfen);
printf("\n请输入添加的姓名,学号,(语文,英语,数学分数)");
scanf("%s%s%s%s%s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue);
fseek(fp,offset,SEEK_SET);
printf("%ld",ftell(fp));
fprintf(fp,"%-21s%-11s%-9s%-9s%-9s%-9s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue,one.fenshuo.zongfen);
}
else
printf("\n对不起,班级中没有此人记录。
");
fclose(fp);
}
voiddeete()
{
intm,k=0,flag;
longoffset1,offset2;
charnamekey[20],valid[4];
structstudentone;
printf("\n请输入姓名:
");
scanf("%s",namekey);
if((fp=fopen(filename,"r+"))==NULL)
{
printf("\n不能打开班级!
");
exit(0);
}
while(!
feof(fp))
{
offset1=ftell(fp);
fscanf(fp,"%s%s%s%s%s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue);
if(!
strcmp(namekey,one.name))
{
k=1;
break;
}
}
if(k)
{
printf("\n\n已查到,记录为:
");
printf("%-21s%-11s%-9s%-9s%-9s%-9s\n",one.name,one.num,one.fenshuo.yuwen,one.fenshuo.yingyu,one.fenshuo.shuoxue,one.fenshuo.zongfen);
printf("\n确实要删除,按1;不删除,按0:
");
scanf("%d",&m);
if(m)
{
fseek(fp,offset1,SEEK_SET);
fprintf(fp,"%-21s%-11s%-9s%-9s%-9s%-9s\n","","","","","","");
}
}
else
printf("\n对不起,班级中没有此人记录。
");
fclose(fp);
}