前言:
仅仅三天的课程设计使我学会了很多,(课设小背景:这两套题其实并没有提前做,自己太懒了/笑哭/,写这个时还有“课设一”中3道题和“课设二”中7道题没有做,又因为元旦假期少了两天的课,所以只有三天时间,会有些赶,但却又显得这次的课设...嗯...其实还蛮充实的,而且自我感觉收获颇多)之前也写过一些代码,虽然前两个课题可还行,但后面可能有些就直接复制粘贴了,但这次的写过的这些代码,我只有两到三个个是借鉴CSDN博客中的,大部分是自己真的想了,然后写出来的。就是也get到了一些“新技能”,会在下面报告中把我学到的而且对于我来说是新的知识的见解写到里面。对于C,我还想了解更多,学习更多,期待下学期的程序设计课,也期待自己对程序设计的探索。
摘要:关于C++中多组输入问题,找规律以及对函数库的调用、函数的使用、插入排序、最大最小值的求解、循环、嵌套、对超时、超空间等问题进行优化,使其运行;极限、回文串、转换进制
关键词:多组输入 规律 函数 优化 极限 转换进制
目录:
Problem A ~ O
课题来源:http://acm.hdu.edu.cn/
Problem A
课题综述:
Problem Description
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2 Output 对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。 Sample Input 3 99 98 97 4 100 99 98 97 Sample Output 98.00 98.50 系统分析: 因为要去掉一个最高分和一个最低分,即最大最小值,因此可以这样来想:先把这一组数据排序,从大到小和从小到大都可以,去掉两端的,将中间所有数据相加,再除以 总的个数减去2,就是最终的平均值。 细节处理: 因为最后要保留两位小数,所以在以下求平均值时,所有数据相加赋给的那个参数不要用int来定义,否则最后输出的都为整数(代码第19行,若之前定义的p,t为整型,则输出为整数);多组输入用while( );最后printf输出的时候,加“\n”换行;以及sort 调用 源代码: Problem B 课题综述: Problem Description 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛? Input 输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0 n=0表示输入数据的结束,不做处理。 Output 对于每个测试实例,输出在第n年的时候母牛的数量。 每个输出占一行。 Sample Input 2 4 5 0 Sample Output 2 4 6 系统分析: 读懂大概题意后,就可以找规律了:第一年只有一头母牛,况且第一个第四年就又有一头小母牛可以生小母牛了,前四年每年新生一头,第五年新生的一头加上小母牛新生的一个头是一共新生了2头,再加前四年的4头是一共6头,第六年新生3头共9头......可以找到规律某一年的小母牛的头数是这一年的前一年的小母牛的头数加上这一年的前三年的小母牛的头数,形象点说可以是a[n]=a[n-1]+a[n-3],即第n年的等于第n-1年的加第n-3年的小母牛头数,前四年的可以先直接定义,后面就循环去算了 细节处理: While( )的多组输入,n=0时的break;停止运行;前四年的定义在每次运行完的时候,别忘了赋其初值,在多组输入的第一行赋初值。 源代码: Problem C 课题综述: Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。 其中,蜂房的结构如下所示。 Input 输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0
Output 对于每个测试实例,请输出蜜蜂从蜂房a爬到蜂房b的可能路线数,每个实例的输出占一行。 Sample Input 2 1 2 3 6 Sample Output 1 3 系统分析: 因为路径走法这种问题通常数据很大,所以开始定义的时候可以先往大了定义,比如使用long long 来定义;与Problem C有异曲同工之妙,也是先找规律,我们会发现:输入的两个数的差相同时,他们的路径不同数是一样的;然后一个个的找规律,1 2;1 3;1 4;1 5;...... 1 n;后一组是前面两组的和,又因为差相同,数据相同,具体见下述代码 细节处理: 第一行为总的循环数,要把算法都放在循环里面;还要记得把一些值在下一次循环前赋初值如下的temp=0;a=0;a=1 源代码: PS:下述此问题与此题相似 Problem Description 有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法? Input 输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。 Output 对于每个测试实例,请输出不同走法的数量 Sample Input 2 2 3 Sample Output 1 2 源代码: Problem D 课题综述: Problem Description 有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。 Input 输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。 Output 对于每个测试实例,输出插入新的元素后的数列。 Sample Input 3 3 1 2 4 0 0 Sample Output 1 2 3 4 系统分析: 要插入一个已经从小到大排好的序列,其实要比重新排序再插入的序列简单些,若有n个数,先循环n次输入排好的序列,将输入的值赋给数组中的一个值,例如数组的最后一个,再用sort排序从小到大输出,0&&0时就直接break;(祝:在多组输入循环内break)就好啦 细节处理: 最后输出换行,.....< 源代码: Problem E 课题综述: Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。 现在要求输出所有在m和n范围内的水仙花数。 Input 输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。 Output 对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开; 如果给定的范围内不存在水仙花数,则输出no; 每个测试实例的输出占一行。 Sample Input 100 120 300 380 Sample Output no 370 371 系统分析: 题眼在这:大于等于m,小于等于n,就在此区间中的“水仙花数”,那我们可以用循环,i=m;i<=n;i++来循环,设这个数为i,用i来表示a,b,c就可以是:a=i/100;b=i%100/10;c=i%10;都定义为整型就可以,继续往下写就OK了;还需要用到标志变量,flag或是随便定义一个也可以,据目前我所知,用法都差不多。 细节处理: 记得多组数据的输入;用标志变量时,在大循环的开始再给标志变量赋初值;最后一个数据的输出不要带空格,用标志变量来处理;如果有水仙花数的话,t变为1,若t为0,就直接输出“no”。 源代码: Problem F 课题综述: Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵 但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就在考虑一个问题:如果每个老师的工资额都知道,最少需要准备多少张人民币,才能在给每位老师发工资的时候都不用老师找零呢? 这里假设老师的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。 Input 输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n位老师的工资。 n=0表示输入的结束,不做处理。 Output 对于每个测试实例输出一个整数x,表示至少需要准备的人民币张数。每个输出占一行。 Sample Input 3 1 2 3 0 Sample Output 4 系统分析: 这个题分析的话就是,可能不是那么简洁,但这是我能想到的做法,一级级的往下算,100,、50、10、5、2、1,先除以100得z(int z);用新得的a[i]对100求余,再除以50+z;用新得的a[i]对50求余,再除以10+z;一直做这样的处理加到1,就可以了;最后输出z;详情看如下所示代码。 细节处理: 多组输入;输入为0时break;;标志变量循环后赋初值。 源代码: Problem G 课题综述: Problem Description “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。 Input 输入包含多个测试实例,输入数据的第一行是一个正整数n,表示测试实例的个数,后面紧跟着是n个字符串。 Output 如果一个字符串是回文串,则输出"yes",否则输出"no". Sample Input 4 level abcde noon haha Sample Output yes no yes no 系统分析: 回文串的话,这个题比较简单了,a.定义数组,输入,然后求字符串长度,数组的第一个等于最后一个,第二个等于倒数第二个......用for循环就可以,详细见如下代码。b.另一种方法我没有试过但应该还可以,先输入一个数组,逆序输出,然后循环比较两组数据是否相等,相等输出“yes”,else为“no”。 细节处理: strlen()字符串长度,调用 源代码: Problem H 课程综述: Problem Description 输入一个十进制数N,将它转换成R进制数输出。 Input 输入数据包含多个测试实例,每个测试实例包含两个整数N(32位整数)和R(2<=R<=16, R<>10)。 Output 为每个测试实例输出转换后的数,每个输出占一行。如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等)。 Sample Input 7 2 23 12 -4 3 Sample Output 111 1B -11 系统分析: 输入的十进制数分+、-、0;所以先分类讨论,若n==0,直接输出0;若n<0,先用printf输出“-”n=-n来算;若n>0,则正常来编译;设某进制为m进制,求i-1;如果R大于10,则对应的数字规则参考16进制(比如,10用A表示,等等),则进行相应处理,详情见下列代码。 细节处理: 多组输入,循环后标志变量要赋初值;最后换行;还有中间过程中的i=i-1. 源代码: Problem I 课题综述: Problem Description 大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号。假设所有的短号都是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。 现在,如果给你一个11位长的手机号码,你能找出对应的短号吗? Input 输入数据的第一行是一个N(N <= 200),表示有N个数据,接下来的N行每一行为一个11位的手机号码。 Output 输出应包括N行,每行包括一个对应的短号,输出应与输入的顺序一致。 Sample Input 2 13512345678 13787654321 Sample Output 645678 654321 系统分析: 大体思路:输入11位手机号后,选出后五位,在后五位前加上6即可。实现步骤:先定义字符串数组,然后再输入整数,表示一共有几组要求校园短号;可以先用for循环输入11位手机号,再用一次for循环输入后五位,也就是从i=7;到i<=11循环输出,在第二次for循环前输出“6”即可,详见如下代码。 细节处理: 由第一行整数限制的多组输入;最后加cout< 源代码: Problem J 课题综述: Problem Description 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为: 1+2+4+5+10+11+20+22+44+55+110=284。 而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。 你的任务就编写一个程序,判断给定的两个数是否是亲和数 Input 输入数据第一行包含一个数M,接下有M行,每行一个实例,包含两个整数A,B; 其中 0 <= A,B <= 600000 ; Output 对于每个测试实例,如果A和B是亲和数的话输出YES,否则输出NO。 Sample Input 2 220 284 100 200 Sample Output YES NO 系统分析: 真约数其实就是可以整除所输入的数据,所以首先就想到可以用输入的整数去除以从一到这个数的每个数,再循环相加,看是否等于输入的第二个整数;对第二个整数用同样操作,最后判断。细节处理如下 细节处理: 先定义下列要包含的行数m,再定义两个整数a,b,int i,j,sum1=0,sum2=0;i从1到a的循环,将真约数的和一起输出赋值给sum1,同样j从1到b的循环,将真约数的和相加赋值给sum2,若sum1==b且sum2==a,则输出YES,否则NO。进行下一组的运算时,要把sum1,sum2再赋一次初值,放在大循环的最后或最前面。 源代码: Problem K 课题综述: Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。 不吉利的数字为所有含有4或62的号码。例如: 62315 73418 88914 都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。 你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。 Input 输入的都是整数对n、m(0 Output 对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。 Sample Input 1 100 0 0 Sample Output 80 系统分析: 遍历,这是我看到题的第一想法,试着来看一下:如果一个数中含4或相连的62,则将这个数pass掉,用遍历筛选就可以 细节处理: 对于求相连的62,i/10==6 i%10==2 源代码: Problem L 课题综述: Problem Description 妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐。现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵。 Input 输入含有一些数据组,每组数据包括菜种(字串),数量(计量单位不论,一律为double型数)和单价(double型数,表示人民币元数),因此,每组数据的菜价就是数量乘上单价啊。菜种、数量和单价之间都有空格隔开的。 Output 支付菜价的时候,由于最小支付单位是角,所以总是在支付的时候采用四舍五入的方法把分头去掉。最后,请输出一个精度为角的菜价总量。 Sample Input 青菜 1 2 罗卜 2 1.5 鸡腿 2 4.2 Sample Output 13.4 系统分析: 看题意就知道又是循环相加问题, 大体就是用循环输出时,两数相乘赋给一个变量,变量随循环相加。详细见细节处理 细节处理: 因为最后输出精度为角,开始定义时就不要用整型来定义了,再定义一组字符串来输入菜名;用while( ),来进行多组输入,将每行单价乘菜价赋给一个值,例如p,p随循环累加就可以了;最后输出时记得保留一位小数加换行,sum还要赋初值。 源代码: Problem M 课题综述: Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。编程输出该平均值序列。 Input 输入数据有多组,每组占一行,包含两个正整数n和m,n和m的含义如上所述。 Output 对于每组输入数据,输出一个平均值序列,每组输出占一行。 Sample Input 3 2 4 2 Sample Output 3 6 3 7 系统分析: 输入2 4 6 8 10 ......n个数,若m为3,就是三个一组的输出平均值,若剩余的数不足三个,则按实际情况求平均值 细节处理: 题中是以2开始的递增偶数序列,前面做一些处理,然后用循环m个m个的求平均值,平均值的次数是开始处理的 源代码: Problem N 课题综述: Problem Description 输入n(n<=100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。 Input 输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,n=0表示输入数据的结束,不做处理。 Output 对于每个测试实例,输出排序后的结果,两个数之间用一个空格隔开。每个测试实例占一行。 Sample Input 3 3 -4 2 4 0 1 2 -3 0 Sample Output -4 3 2 -3 2 1 0 系统分析: 先将其绝对值按从小到大的顺序排列,再输出原始的数列;0的时候,break; 细节处理: 先输入开始的n,然后输入一个数组,将其全部取绝对值,然后进行排序,然后按最开始的数组输出。 源代码: Problem O 课题综述: Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击——赛跑输给乌龟后,心中郁闷,发誓要报仇雪恨,于是躲进了杭州下沙某农业园卧薪尝胆潜心修炼,终于练成了绝技,能够毫不休息得以恒定的速度(VR m/s)一直跑。兔子一直想找机会好好得教训一下乌龟,以雪前耻。 最近正值HDU举办50周年校庆,社会各大名流齐聚下沙,兔子也趁此机会向乌龟发起挑战。虽然乌龟深知获胜希望不大,不过迫于舆论压力,只能接受挑战。 比赛是设在一条笔直的道路上,长度为L米,规则很简单,谁先到达终点谁就算获胜。 无奈乌龟自从上次获胜以后,成了名龟,被一些八卦杂志称为“动物界的刘翔”,广告不断,手头也有了不少积蓄。为了能够再赢兔子,乌龟不惜花下血本买了最先进的武器——“"小飞鸽"牌电动车。这辆车在有电的情况下能够以VT1 m/s的速度“飞驰”,可惜电池容量有限,每次充满电最多只能行驶C米的距离,以后就只能用脚来蹬了,乌龟用脚蹬时的速度为VT2 m/s。更过分的是,乌龟竟然在跑道上修建了很多很多(N个)的供电站,供自己给电动车充电。其中,每次充电需要花费T秒钟的时间。当然,乌龟经过一个充电站的时候可以选择去或不去充电。 比赛马上开始了,兔子和带着充满电的电动车的乌龟并列站在起跑线上。你的任务就是写个程序,判断乌龟用最佳的方案进军时,能不能赢了一直以恒定速度奔跑的兔子。 Input 本题目包含多组测试,请处理到文件结束。每个测试包括四行: 第一行是一个整数L代表跑道的总长度 第二行包含三个整数N,C,T,分别表示充电站的个数,电动车冲满电以后能行驶的距离以及每次充电所需要的时间 第三行也是三个整数VR,VT1,VT2,分别表示兔子跑步的速度,乌龟开电动车的速度,乌龟脚蹬电动车的速度 第四行包含了N(N<=100)个整数p1,p2...pn,分别表示各个充电站离跑道起点的距离,其中0 其中每个数都在32位整型范围之内。 Output 当乌龟有可能赢的时候输出一行 “What a pity rabbit!"。否则输出一行"Good job,rabbit!"; 题目数据保证不会出现乌龟和兔子同时到达的情况。 Sample Input 100 3 20 5 5 8 2 10 40 60 100 3 60 5 5 8 2 10 40 60 Sample Output Good job,rabbit! What a pity rabbit! 系统分析: 细节处理: 源代码: 终极总结: 虽然只有短短的几天,但是确实学到了很多,三天的课程程序设计很充实,比起之前在网页上做的代码题,好像又get了些新技能。虽然很多题,我还不会很好的优化,也不太清楚很多的函数调用和使用,但用最基本的只是也还是能写的出来,也能A了?。对于stdlib.h之类的函数,还有一些需要做预处理,标志变量之类的,我还不是很了解,寒假再慢慢学习吧。 其实开学最开始学C的时候,没有认真地在听,总觉得虽然自己不会,但以后会慢慢赶上来的,其实在这种想法产生的时候,就注定自己已经不是第一了,包括我的专业课在内,都是这样的情况。可能有时候一旦觉得自己不是最好的那个,也就不想学了,其实自己在逃避。我应该再试着克服这种心理矛盾,踏踏实实,不去攀比地学好自己认为自己该学会的,该学好的,包括专业课在内;更多的也是想去完善自己,毕竟现在的圈子只是一个过渡区,也是舒适圈的分水岭,要跳出舒适圈,寻找真正属于自己的地方,也许是一个全新的朋友圈,又也许是自己内心的某个角落。 ACM,我比较期待的竞赛,我会好好努力的,希望我可以是参赛队中的一员。对于程序设计的热情不减,学习也就不止,程序设计在不断更新,不断进步,自己也要去不断地学习,跟进时代的发展,包括对自己的要求也要逐渐提升,也希望自己可以在这条路上能走的更远,也能在这里遇见更好的自己。 #include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include