前言:
仅仅三天的课程设计使我学会了很多,(课设小背景:这两套题其实并没有提前做,自己太懒了/笑哭/,写这个时还有“课设一”中3道题和“课设二”中7道题没有做,又因为元旦假期少了两天的课,所以只有三天时间,会有些赶,但却又显得这次的课设...嗯...其实还蛮充实的,而且自我感觉收获颇多)之前也写过一些代码,虽然前两个课题可还行,但后面可能有些就直接复制粘贴了,但这次的写过的这些代码,我只有两到三个个是借鉴优快云博客中的,大部分是自己真的想了,然后写出来的。就是也get到了一些“新技能”,会在下面报告中把我学到的而且对于我来说是新的知识的见解写到里面。对于C,我还想了解更多,学习更多,期待下学期的程序设计课,也期待自己对程序设计的探索。
摘要:关于C++中多组输入问题,找规律以及对函数库的调用、函数的使用、插入排序、最大最小值的求解、循环、嵌套、对超时、超空间等问题进行优化,使其运行;极限、回文串、转换进制
关键词:多组输入 规律 函数 优化 极限 转换进制
目录:
Problem A ~ O
课题来源:http://acm.hdu.edu.cn/
Problem A
课题综述:
Problem Description
青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个评委的打分。
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 调用<algorithm>;
源代码:
#include<iostream>
#include<algorithm>
int a[101];
using namespace std;
int main()
{
int n,i;
double p,t=0;
while(cin>>n)
{
t=0;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a,a+n+1);
for(i=2;i<=n-1;i++)
{
t=t+a[i];
}
p=t/(n-2);
printf("%.2lf\n",p);
}
return 0;
}
Problem B
课题综述:
Problem Description
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
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;停止运行;前四年的定义在每次运行完的时候,别忘了赋其初值,在多组输入的第一行赋初值。
源代码:
#include<iostream>
#include<cmath>
int a[56];
using namespace std;
int main()
{
int n,i;
while(cin>>n)
{
a[1]=1;a[2]=2;a[3]=3;a[4]=4;
if(n==0)break;
if(n==1||n==2||n==3||n==4)cout<<a[n]<<endl;
if(n>4)
{
for(i=4;i<=n;i++)
{
a[i]=a[i-1]+a[i-3];
}
cout<<a[n]<<endl;
}
}
return 0;
}
Problem C
课题综述:
Problem Description
有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。
其中,蜂房的结构如下所示。
Input
输入数据的第一行是一个整数N,表示测试实例的个数,然后是N 行数据,每行包含两个整数a和b(0<a<b<50)。
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
源代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int m,x,y;
long long temp,a,b;
cin>>m;
for(int j=1;j<=m;j++)
{
cin>>x>>y;
temp=0;a=0;b=1;
for(int i=x;i<y;i++){
temp=a+b;
a=b;
b=temp;
}
cout<<b<<endl;
}
return 0;
}
PS:下述此问题与此题相似
Problem Description
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
Input
输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。
Output
对于每个测试实例,请输出不同走法的数量 <