ACM软件大赛之编程大赛题目(附部分答案)_第1页
ACM软件大赛之编程大赛题目(附部分答案)_第2页
ACM软件大赛之编程大赛题目(附部分答案)_第3页
ACM软件大赛之编程大赛题目(附部分答案)_第4页
ACM软件大赛之编程大赛题目(附部分答案)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、AC楸件大赛之编程大赛比赛注意事项:比赛时间为3小时(180分钟);比赛分两个阶段:第一阶段限时30分钟,完成公示的3题,第二阶段限时150分钟(事先完成第一阶段题目的小组可提前进入第二阶段);比赛第一阶段的3道题目将在前期宣传中告知参赛选手,比赛第二阶段的题目将由赛事主席当场公布竞赛题目;前两阶段题目分为三个分值(5分、10分、15分),第一阶段3道公示题都为5分;第二阶段总共15道题,根据不同的难度分值不同,分别为5道5分题,5道10分题,5道15分题;第一阶段参赛队员不可参考任何相关资料;第二阶段参赛队员可以携带诸如书,手册,程序清单等参考资料。比赛过程中队员不得携带任何电子媒质的资料;

2、参赛者可以选择自己擅长的语言( C,C+,JAVA等等)进行编写考虑到大一和大二学生的知识掌握程度,大一参加选手一开始就会有10分的分数,最后总分是由所做题目及初始的10分相加得到。每组队员根据安排使用电脑,小组人数为两人的使用一台电脑,超过两人的使用两台电脑,每台的电脑配置完全相同;各小组每做完一题或几题,必须交予评委老师运行,评委老师当场给分;如在比赛中发现作弊等行为,将取消比赛资格。第一阶段公示题目:题目一:(5分)打印以下图形,纵遵从字母顺序,行字符数遵从斐波那契数列ABCCDDDEEEEEFFFFFFFFGGGGGGGGGGGGG#include int f(int x)int a

3、= 1 , b = 0;int max_ = x;int sum = 0;for(int i = 0; i max_ ; i+)sum = a + b;a = b;b = sum;return sum;void loop_print(int num,char chr)for(int i = 0; i num ;i+) std:coutchr;std:coutn;int main()int line_max = 7;char chr = A;for(int line = 0; line line_max; line+)loop_print(f(line+1),chr);chr+;return 0

4、;题目二:(5分)有个电子钟,12点显示为12:00 (即12小时制),那么请问一天 24时间,出现连续3个相 同数字的钟点有几个?#includeusing namespace std;bool check(int time)int h=time/100;int m=time-100*h;return h=12&m0?true:false;/12 小时制int main()int time=0;int j(0);/总计数器while(time1270)max 12:59int t=time;int n4;for(int i=0;i4;i+)ni=t%10;t /= 10;if(n1=n2&(

5、n0=n111n3=n1)&check(time) coutn3n2:n1n0n;/test j+;time+;couttotal: j*2endl;题目三:(5分)10进制的四位数中有几个符合如下特征:将其分别表示为16进制、10进制、12进制,在每种状态下,分别将各个位上的数相加,能得到 3个相等10进制数。例如299210 进制:2992 2+9+9+2 = 2212 进制:1894 1+8+9+4 = 2216 进制:BB0 11 + 11+0 = 222992-2999#include#includeusing namespace std;int convert(int n,int

6、c)float high_p=0;int sum=0;int a4=0,0,0,0;for(int i=0;i+)float testN = pow(c,(float) i);if(n=testN)high_p=i;else break;for(int i=0;high_p!=-1;i+)ai=n/pow(c,high_p);n-=ai*pow(c,high_p);high_p-;for(int i=0;i4;i+)sum+=ai;return sum;int main()int j=0;for(int i=1000;i=9999;i+)if(convert(i,16)=convert(i,1

7、0)&(convert(i,10)=convert(i,12) coutiendl;j+;coutj;return 0;第二阶段题目:题目一:(5分)不引入临时变量写出swap(a,b)功能void swap(int &a, int &b)a += b;b = a-b;a -= b;题目二:(5分)she分别代表3个数字,已知:(he)A2=sheshe=?#includeint main()for(int he=15;he=96;he+)for(int s=1;s=9;s+)if(he*he=100*s+he)std:couthe*heendl;return 0;题目三:(5分)有4条狗A、

8、R C D,他们分另J在一条 100m的公路上步行,速率均为5m/s, A初始在30m处,B初始在65m处,C初始在75m处,D初始在95m处,初始左右方向是随意的,任意两狗相遇则各自掉头(掉头时间不计,速率保持5m/s)。请问,4条狗最终都离开公路的最大时间是几秒?#includeint main()std:cout95/5;return 0;题目四:(5分)Big Bang中的高级石头剪刀布问题Scissors - PaperPaper - RockRock - ScissorsRock - LizardLizard - SpockSpock - ScissorsScissors - Li

9、zardLizard - PaperPaper - SpockSpock - Rock规则是左边的手势赢右边的手势,现有玩家P1、P2,输入各自选择的手势,得出胜负。#include#includeusing namespace std;int main()int p2, p1;cout 1.Paper endl 2.Rock endl 3.Lizard endl 4.Spock endl 5.Scissors p1 p2;float n = p1 - p2;if (n * pow(-1, fabs(n) 0)/此算法由 yaozizi 提供cout p2 win;else if (n = 0

10、)cout duce;elsecout p1 win;return 0;)题目五:(5分)游戏规则:21根火柴,每次取1-4根,谁取走最后一根判输。现在人和计算机博弈,设计 一个程序保证计算机必胜,要求每回合人与计算机各输入(或返回)一个代表取走火柴根数的数,直到游戏结束。#includeusing namespace std;int main()int n=21;int p,c;while(n!=0)cinp;while(p4|p=0|n-p0)couterr, input againp;)if(n!=0) if(n!=1)cout5-pendl;else cout=5)n-=5;)题目六:

11、(10分)下列式子:2+3+4=91+2+3+4=10显然右边的数都能表示为n (n2)个连续自然数之和(1开始),暂称之为冏数但似乎23、32等数都不能写成几个数之和的形式,所以它们不是冏数这里有个可行的判断方法为:上限为N,则测试1+2+31+2+3+41+2+3+4+N2+3+42+3+4+N(N-2)+(N-1)+N是否等于N这是一种可行但非常暴力的穷举实际上冏数还是有一些规律可循的,请设计一个优于之前提到的算法要求输入一个数,并判断它是否为冏数/*1 .如果一个数能被奇数(=3)整除,则必能写成 X= 平均数*中间数的形式,所以是冏数2 .如果一个数是合数,如果其中有奇数因子,则回到

12、 1,为冏数;如果它是2的乘方,则不 是冏数证明:它无法写成奇数个相加,因为除不尽奇数;也不能写成偶数个相加,中间数有两个,和必为奇数,这个奇数必然是欲判断数的一个因子 3.如果一个数是素数,则必须是6、10、14、18个数相加得来,这样才能得到奇数,根据高斯求和公式,这样的和必有奇数因子 综上:只有2的乘方、素数、小于 6的自然数,不是冏数 */#includeusing namespace std;bool check(long tar)bool flag = false;if(tar6)flag = false; else if(tar%2=0)/ 偶数是否是2的阶乘while(tar%

13、2=0)tar/=2; tar=1?flag=false:flag=true;else / 奇数是否是素数 double end = tar;for(int i=3;itar;bool flag = check(tar);coutflag;return 0;题目七:(10分)现有一个固定的正方形区域,可以把它看作是一个数据库中的特别的二维码1110101001011011101100100其中每一位表示黑和白,假设这种二维码容错性只有5%即只要有1位以上不符合要求就无法识别。现在输入一个5*5的类似区域(相当于扫描一个二维码),如果在容错围,则认为它可识别。 如果不是精确匹配,需输出错误位的位

14、置。#include#includeusing namespace std;int main()int err = 0, j = 0;char a26;char b26= 1110101001011011101100100;for(int i=0;iai;if(ai!闽i)j=i;err+;if(err=2)coutfail;else if (err=0)coutmatched;elseint y = (j+1)/5+1;int x = j%5+1;cout(x,y);return 0;题目八:(10分)每个人每天早上都要思考一个问题,这个问题的历史已经悠久得无法追溯,那就是:今天午饭吃什么。

15、现在有个腻歪的人,他已经妥协于人工智能来解决日常问题,妄图找出吃饭问题的通解已知:根据区域定位有以下地方可去:围1 : a品尝坊、b三疯、c南区食堂围2: d北区食堂、e咪哆围3: f大小姐的店根据远近程度和价格因素,希望一周5天去围1的几率为20%去围2的几率为70%去围3的几率为10% (理论值)。请写一段程序,随机输出 15个字母(实际值),确定半个月的吃饭问题(不考虑跨平台)注意:以上概率是指 【如果】取输出个数趋近于无穷时的概率,而不是指15次*20%等式四舍五人得到的输出结果。#include#includelinux /dev/random#include using names

16、pace std;/*float set_rand()srand(time_t(time(NULL);/低精度取种,需循环辅助float r = rand()%1000; return r/10;/.000-.999*/float SetRand()LARGE_INTEGER Start;QueryPerformanceCounter(&Start);srand(long)Start.LowPart);/高精度取种long RndNum = rand()%1000;return (float)RndNum/1000;/.000-.999 int main()for(int i=0;i15;i+

17、)if(SetRand()=.2)if(SetRand()=1/3)cout2/3)coutc;else cout.9)coutf;else if(SetRand()=.5)coutd;else coute;return 0;题目九:(10分) 约瑟夫是一名犹太历史学家。他在自己的日记中写道,他和他朋友与 39个战友(共41人) 被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀。自杀规则规定,所有人围成一个圈,由一人开始报数,报到 3的被杀死,下面的人继续从1报数,约瑟夫终和他的朋友活了下来。问:最初约瑟夫和他的朋友占据这个队伍的位置各为第几个?无脑穷举,结果16、31#includ

18、eusing namespace std;int main()int j=0;int s=0;/jmp 3int n41;for(int i=0;i41;i+)ni=1;for(int i=0;j39;i+)if(i=41)i=0;s+=ni;if(s=3)s=0;ni=0; j+;for(int i=0;i41;i+)if(ni=1)couti+1endl;return 0;题目十:(10分)设计一个算法,计算输出1至这个自然数间1共出现了几次,如 1-11间1出现了 4次。假设数在int围,不考虑效率。(若算法效率足够高可先至14题)int count(int n)int i = 0;wh

19、ile(n != 0)i += (n % 10 = 1)?1:0;n/=10; return i;int f(int n)int c = 0;for (int i = 1;i=n;i+) c += count (i);return c;题目H一:(15分)假设5*4的代表一个逆时针旋转的字母区域,输入长宽,打印一个类似的字母区域,乘积若超过26继续由新一组的 A B、C填充,不要求车出边框,例如 5*4的样式如下:A B C D EN O P Q FM T S R G L K J I H#include#include#define N 100char aNN;int direction42=

20、0,1,1,0,0,-1,-1,0;左、右、下、上的顺序int main()/freopen(in.txt,r,stdin);int i,j,n,m,next_i,next_j,x,ch,count;while(scanf(%d%d,&n,&m)!=EOF)i=j=next_i=next_j=x=ch=count=0;memset(a, ,sizeof(a);while(countn*m)aij=A+ch%26;next_i=i+directionx0;next_j=j+directionx1;if(anext_inext_j!= |next_i=n|next_j=m)x=(x+1)%4;按顺

21、序向其他方向next_i=i+directionx0;next_j=j+directionx1;ch+;count+;i=next_i;j=next_j;for(i=0;in;i+)for(j=0;jm;j+)printf(%4c,aij);printf(n);return 0;题目十二:(15分)设计一个函数f($a,$b),其中“ $a,$b”代替一个无限循环小数,$a为固定部分,$b为循环体。要求输出一个“Xy”的最简分数表达这个有理数,并测试-13.14(135)=-48623/3700#include#includeusing namespace std; int cal(int x

22、,int y)return (!y)?x:cal(y,x%y);/辗转相除void f(float s,char loop儿int sign=1;abs(s)=s?NULL:sign=-1;long n3=0;int i=0;for(;loopi!=0;i+)n3=loopi-0+n3*10;char to usigned longlong m3 = pow(10,(float)i)-1;s=abs(s);long n2=1,m2=1;float temp=s; for(int j=0;j+)long dj=(long)temp;if(temp=(long)dj)break;temp=s*po

23、w(10,(float)j);m2=pow(10,(float)(j);n2=temp;long m1=m2*(m2*m3);long n1=n3*m2+n2*(m2*m3);long h=cal(m1,n1);m1/=h;n1/=h*sign;s*=sign;couts(loop尸n1/m1endl; int main() f(-13.14,135); return 0;题目十三:(15分)输入4个坐标(前3个互不相同,且不共线),判断第4个点与前3个点所组成的三角形的 位置关系(、外、上)。#include#include using namespace std;struct pointd

24、ouble x,y;;double len(point A,point B)return sqrt(pow(A.x-B.x),2)+pow(A.y-B.y),2);double area(point A,point B,point C)/海伦公式1/2*abs(A.x*B.y+B.x*C.y+C.x*A.y)-(A.x*C.y+B.x+A.y+C.x*B.y);/vector double a = len(B,C);double b = len(C,A);double c = len(A,B);double p = .5*(a+b+c);return sqrt(p-a)*(p-b)*(p-c)*p);int flag(point A,point B,point C,point D)double ABC = area(A,B,C);double ABD = area(A,B,D);double ACD = area(A,C,D);double BCD = area(B,C,D);coutendlABD+ACD+BCD-ABC=1E-5?-1:(ABD|ACD|BCD?1:0);/*相加与ABC不等在ABC外,返回-1此处表示ABD+ACD+BCD ABC吴差超过10人-5 ,则说明在外 由于double开根导致精度损失,如要

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论