ACM程序设计与竞赛作业.doc
《ACM程序设计与竞赛作业.doc》由会员分享,可在线阅读,更多相关《ACM程序设计与竞赛作业.doc(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ACM程序设计与竞赛作业1. 采药2. 金字塔问题3. 毛毛虫问题4. Hamming Problem5. 字符串正反连接6. 去掉空格7. 成绩转换8. 金块问题9. 工资问题10.“水仙花数”问题11.大小写转换12.取数游戏13.整除问题14.警察抓小偷15.n!16.汉诺塔问题17.猴子吃桃问题(递归)18. A+B for Input-Output Practice (I)19. A+B for Input-Output Practice (II)20. A+B for Input-Output Practice (III)21. A+B for Input-Output Pract
2、ice (IV)22.埃及分数23.完数24. Fibbonacci Number _Hdu 207025. Pakets26. 不要62 _Hdu 20891问题 B: 采药时间限制:1 Sec内存限制:128 MB提交:87解决:72提交状态讨论版题目描述辰辰是个很有潜能、天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的
3、孩子,你应该可以让采到的草药的总价值最大。”如果你是辰辰,你能完成这个任务吗?输入输入的第一行有两个整数T(1 T 1000)和M(1M 100),T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。输出输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。样例输入70 371 10069 11 2 样例输出3#include stdio.hvoid main() int a1021002=0; int t,t1,m1,m,i,i1,k=1; sca
4、nf(%d%d,&t,&m); scanf(%d%d,&t1,&m1); for(i1=1;i1=t1) aki1=m1; k+; for(i=2;i=m;i+) scanf(%d%d,&t1,&m1); for(i1=1;i1=t;i1+) if(i1m1+ak-1i1-t1) aki1=ak-1i1; /采完总价值下降 else aki1=m1+ak-1i1-t1;/值得采的情况; k+; printf(%d,amt);心得:这是一个动态规划的题目,首先定义一个二维数组,根据草药的性价比,优先采取较高的草药,如果时间不够,则降低性价比继续采取草药,直至时间结束,根据采集的草药计算它的最大值
5、,这题通过比较算出可能采的情况,和不能采的情况,如果能采,那再判断值不值得采,得出最优解。2问题 A: 金字塔问题时间限制:1 Sec内存限制:128 MB提交:54解决:32提交状态讨论版题目描述給一个金字塔,如上图所示,请你求出一个从塔顶到塔底的路径,要求路径经过的点的数字和最小。例如上图所示的金字塔的最小路径为:40输入输入第一行是一个整数n1000;接下来是n行,第一行一个数;第二行两个数;。第n行n个数;数之间用空格分开。数的链接方式如图所示。输出一个数,就是从塔顶到塔底的路径的最小距离。样例输入5912 1510 6 83 18 9 519 7 10 4 16样例输出40#incl
6、udevoid main() int i,j,n; int a100100;定义一个二维数组; scanf(%d,&n); for(i=1;i=n;i+) for(j=1;j=1;i-) for(j=1;jai+1j+1) aij=aij+ai+1j+1; else aij=aij+ai+1j; /求得每次路径最小值; printf(%d,a11); 心得:这个题目主要运用了动态规划的思想,定义一个二维数组,把所输入的数据存入进去,然后从它的第一行处理,比较相邻位置数的大小,取最小的路径和上一行对应的数相加,取得最小路径,进行循环,直到求出数组中a11,即所求的结果。3问题 B: 毛毛虫问题时
7、间限制:1 Sec内存限制:128 MB提交:32解决:16提交状态讨论版题目描述Mary在她家门口水平种了一排苹果树,共有N棵。突然Mary发现在左起第P棵树上(从1开始计数)有一条毛毛虫。为了看到毛毛虫变蝴蝶的过程,Lele在苹果树旁观察了很久。虽然没有看到蝴蝶,但Lele发现了一个规律:每过1分钟,毛毛虫会随机从一棵树爬到相邻的一棵树上。比如刚开始毛毛虫在第2棵树上,过1分钟后,毛毛虫可能会在第1棵树上或者第3棵树上。如果刚开始时毛毛虫在第1棵树上,过1分钟以后,毛毛虫一定会在第2棵树上。现在告诉你苹果树的数目N,以及毛毛刚开始所在的位置P,请问,在M分钟后,毛毛虫到达第T棵树,一共有多
8、少种行走方案数。输入输入四个整数N P M T。输出输出一个整数,就是行走的方案数。样例输入7 4 4 4样例输出6#includevoid main() int i,j; int p,m,n,t; int a100100=0;/定义一个二维数组; scanf(%d%d%d%d,&n,&p,&m,&t); a0p=1;毛毛虫刚开始在数组中的位置; for(i=1;i=m;i+) for(j=1;j=n;j+) aij=ai-1j-1+ai-1j+1;/每一步的方案数; printf(%dn,amt);M分钟后到T棵树行走的方案数;心得:这一题运用了动态规划的思想,毛毛虫的每一步都会影响下一步的
9、结果,所以首先按照普通情况找出规律及其其公式,进而算出方案数。首先定义一个二维数组,初始化毛毛虫的起始位置,然后通过两个循环,求出毛毛虫走每一步的方案数,存在二维数组中,然后求出第M分钟到T棵树行走的方案数。4问题 A: Hamming Problem时间限制:1 Sec内存限制:128 MB提交:61解决:23提交状态讨论版题目描述For each three prime numbers p1, p2 and p3, lets define Hamming sequence Hi(p1, p2, p3), i=1, . as containing in increasing order al
10、l the natural numbers whose only prime divisors are p1, p2 or p3.For example, H(2, 3, 5) = 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, .So H5(2, 3, 5)=6.输入In the single line of input file there are space-separated integers p1 p2 p3 i.输出The output file must contain the single integer - H
11、i(p1, p2, p3). All numbers in input and output are less than 1018.样例输入2 3 5 5样例输出6#include stdio.hint minx(int p1,int p2,int p3)/ 定义有参函数minx; int min=p1; if(p2min) min=p2; if(p3min) min=p3; return min;/求p1,p2,p3的最小值;int main() int p1,p2,p3,t,i; int a,b,c; char num10000; scanf(%d%d%d%d,&p1,&p2,&p3,&t
12、); a=b=c=0; num0=1; for(i=1;i=t;i+) numi=minx(p1*numa,p2*numb,p3*numc);/调用minx函数; if(numi=p1*numa) a+; if(numi=p2*numb) b+; if(numi=p3*numc) c+; 求所有的能被p1,p2,p3整除的数; printf(%dn,numt); return 0; 心得:运用动态规划的思想,定义一个一维数组,把所有符合条件的数按顺序存进一维数组中,这个编程运用了函数调用的方法求三个数的最小值,然后把这个最小值存进一维数组中,每次存进一个数,下次都会用存进去的这个数求解下一个数
13、,进行循环。5问题 B:字符串正反连接时间限制:1 Sec内存限制:128 MB提交:68解决:42提交状态讨论版题目描述所给字符串正序和反序连接,形成新串并输出输入任意字符串(长度=50)输出字符串正序和反序连接所成的新字符串样例输入123abc样例输出123abccba321#include#includevoid main()char a50;/定义一个字符串;int i,f;while(scanf(%s,&a)!=EOF)/实现多行实例输入; f=strlen(a);/把字符串的长度值赋给f; for(i=0;i=0;i-) printf(%c,ai);/把字符串反序输出; print
14、f(n);心得:定义一个字符串,运用strlen()函数获取字符串的长度值f,首先用for循环,把这个字符串正序输出,然后再用for循环对这个字符串进行反序输出,这里主要考察了输入输出。6问题 C: 去掉空格时间限制:1 Sec内存限制:128 MB提交:27解决:4提交状态讨论版题目描述读入一些字符串,将其中的空格去掉。输入输入为多行,每行为一个字符串,字符串只由字母、数字和空格组成,长度不超过80。输入以“End of file”结束。输出对于每行输入,输出转换后的字符串。样例输入Hello World1 2 3Nice to meet youabc样例输出HelloWorld123Nic
15、etomeetyouabc提示用scanf是不能读入一行有空格的字符串的,用gets吧。 用“gets(str) != NULL”可以判断输入是否结束,如果此条件为假(即gets(str) = NULL),则表示输入结束(对于本题)。#include#includevoid main()int i,f;char a90;/定义一个字符串;while(gets(a)!=NULL)f=strlen(a);/把字符串的长度值赋给f; for(i=0;if;i+) if(ai= )printf(%c,ai+1);/去掉空格;i=i+1;elseprintf(%c,ai);/没有空格,直接输出; pri
16、ntf(n);心得:这里也是主要考察输入输出问题,首先也是定义了一个字符串,用strlen()函数获得字符串的长度f,进行f次循环,判断这个字符串是否有空格?如果有把数组中的每个数往后进一位,即去点空格,如果没有直接输出。7问题 D: 成绩转换时间限制:1 Sec内存限制:128 MB提交:78解决:30提交状态讨论版题目描述输入一个百分制的成绩t,将其转换成对应的等级,具体转换规则如下:90100为A;8089为B;7079为C;6069为D;059为E;输入输入数据有多组,每组占一行,由一个整数组成。输出对于每组输入数据,输出一行。如果输入数据不在0100范围内,请输出一行:“Score
17、is error!”。样例输入5667100123样例输出EDAScore is error!提示#includeint main()int x;while(scanf(%d,&x)!=EOF)/实现多行实例输入;if(x60)printf(En);else if(x70)printf(Dn);else if(x80)printf(Cn);else if(x90)printf(Bn);else if(x=2),最优秀的雇员得到其中最重的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。输入输入共两行,第一行输入金块的数量N;第二行N金块的重
18、量,用空格间隔。输出两个数用空格分开,最重金块 最轻金块样例输入53 7 9 6 4样例输出9 3#includeint main()int n,a;int max,min,i;while(scanf(%d,&n)!=EOF)/实现多行实例输入;for(i=0;in;i+)scanf(%d,&ai);max=min=a0;/把数组a0的值赋给max和min;for(i=1;imax)max=ai;/求最最重的金块;for(i=1;in;i+)if(aimin)min=ai;/求最轻的金块;printf(%d %dn,max,min);return 0;心得:这题主要运用分治算法的思想,把一个大
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 程序设计 竞赛 作业
限制150内