2021-2022-2-第5次单元练习后记//Pintia
一个简单的说明
主要以记录题目,分享源码为主
顺带记录做题心路历程
太久没有做题了,手生了,难免犯一些低级错误
最后,顺便对我的后续练习起到一个规划的作用
7-1 电子汪 (10 分)
题面
据说汪星人的智商能达到人类 4 岁儿童的水平,更有些聪明汪会做加法计算。比如你在地上放两堆小球,分别有 1 只球和 2 只球,聪明汪就会用“汪!汪!汪!”表示 1 加 2 的结果是 3。
本题要求你为电子宠物汪做一个模拟程序,根据电子眼识别出的两堆小球的个数,计算出和,并且用汪星人的叫声给出答案。
输入格式:
输入在一行中给出两个 [1, 9] 区间内的正整数 A 和 B,用空格分隔。
输出格式:
在一行中输出 A + B 个Wang!。
输入样例:
2 1
输出样例:
Wang!Wang!Wang!
C++源码
#include<cstdio>
inline int read(){
int f=1,s=0;
char k=getchar();
while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
return f*s;
}
int a,b;
int main(){
a=read(),b=read();
for(int i=1;i<=a+b;++i)printf("Wang!");
return 0;
}
7-2 大笨钟 (10 分)
题面
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数;如果过了整点,就敲下一个整点数。另外,虽然一天有24小时,钟却是只在后半天敲1~12下。例如在23:00敲钟,就是“当当当当当当当当当当当”,而到了23:01就会是“当当当当当当当当当当当当”。在午夜00:00到中午12:00期间(端点时间包括在内),笨钟是不敲的。
下面就请你写个程序,根据当前时间替大笨钟敲钟。
输入格式:
输入第一行按照hh:mm的格式给出当前时间。其中hh是小时,在00到23之间;mm是分钟,在00到59之间。
输出格式:
根据当前时间替大笨钟敲钟,即在一行中输出相应数量个Dang。如果不是敲钟期,则输出:
Only hh:mm. Too early to Dang.
其中hh:mm是输入的时间。
输入样例1:
19:05
输出样例1:
DangDangDangDangDangDangDangDang
输入样例2:
07:05
输出样例2:
Only 07:05. Too early to Dang.
C++源码
#include<cstdio>
int a,b;
int main(){
scanf("%d:%d",&a,&b);
if((a>=0&&a<12)||(a==12&&b==0))printf("Only %02d:%02d. Too early to Dang.",a,b);
else
{
if(a>=12)a-=12;
if(b!=0)++a;
for(int i=1;i<=a;++i)printf("Dang");
}
return 0;
}
我真傻真的,我光想着秒了这套题,却完全没仔细看题(
7-3 吃鱼还是吃肉 (10 分)
题面
国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。
现在你要根据小宝宝的身高体重,给出补充营养的建议。
输入格式:
输入在第一行给出一个不超过 10 的正整数 N,随后 N 行,每行给出一位宝宝的身体数据:
性别 身高 体重
其中性别是 1 表示男生,0 表示女生。身高和体重都是不超过 200 的正整数。
输出格式:
对于每一位宝宝,在一行中给出你的建议:
如果太矮了,输出:duo chi yu!(多吃鱼);
如果太瘦了,输出:duo chi rou!(多吃肉);
如果正标准,输出:wan mei!(完美);
如果太高了,输出:ni li hai!(你厉害);
如果太胖了,输出:shao chi rou!(少吃肉)。
先评价身高,再评价体重。两句话之间要有 1 个空格。
输入样例:
4
0 130 23
1 129 27
1 130 30
0 128 27
输出样例:
ni li hai! duo chi rou!
duo chi yu! wan mei!
wan mei! shao chi rou!
duo chi yu! shao chi rou!
C++源码
#include<cstdio>
inline int read(){
int f=1,s=0;
char k=getchar();
while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
return f*s;
}
int a,b,c,n;
int main(){
n=read();
while(n){
a=read(),b=read(),c=read();
if(a){
if(b<130)printf("duo chi yu!");
else if(b==130)printf("wan mei!");
else if(b>130)printf("ni li hai!");
putchar(' ');
if(c<27)printf("duo chi rou!");
else if(c==27)printf("wan mei!");
else if(c>27)printf("shao chi rou!");
}
else{
if(b<129)printf("duo chi yu!");
else if(b==129)printf("wan mei!");
else if(b>129)printf("ni li hai!");
putchar(' ');
if(c<25)printf("duo chi rou!");
else if(c==25)printf("wan mei!");
else if(c>25)printf("shao chi rou!");
}
n--;
putchar('\n');
}
return 0;
}
7-4 小鲁摘苹果 (10 分)
题面
小鲁家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,小鲁就会跑去摘苹果(不如我们去帮他吃掉)。小鲁有个30厘米高的板凳,当他不能直接用手摘到苹果的时候,就会踩到板凳上再试试。 现在已知10个苹果到地面的高度,以及小鲁把手伸直的时候能够达到的最大高度,请帮小鲁算一下他能够摘到的苹果的数目。假设他碰到苹果,苹果就会掉下来。(苹果很配合哦)
输入格式:
输入包括两行数据。 第一行只包括一个100到120之间(包含100和120)的整数(单位:厘米),表示小鲁把手伸直的时候能够达到的最大高度。
第二行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。
输出格式:
输出包括一行,这一行只包含一个整数,表示小鲁能够摘到的苹果的数目。
输入样例:
110
100 200 150 140 129 134 167 198 200 111
输出样例:
5
C++源码
#include<cstdio>
inline int read(){
int f=1,s=0;
char k=getchar();
while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
return f*s;
}
int n,a,b;
int main(){
b=0;
n=read();
for(int i=1;i<=10;++i){
a=read();
if(a<=n+30)b++;
}
printf("%d",b);
return 0;
}
7-5 关羽 (10 分)
题面
关羽千里走单骑去寻找兄长,需要连过10关。先输入关羽的武力,再输入10关守将的武力。如果关羽武力强于守将武力,则能够通过该关;如果守将武力强于或等于关羽,则无法通过该关;请问关羽能否找到兄长?
输入格式:
第一行1个实数,表示关羽的武力。 接下来10行,每行一个实数,分别表示10关守将的武力。
输出格式:
如果关羽成功过10关,则输出"GOOD";否则输出一个整数,表示关羽在哪一关失败。
输入样例:
14.5
11.9
6.0
12.4
10.6
7.0
11.4
13.0
10.5
12.8
11.0
输出样例:
GOOD
C++源码
#include<cstdio>
#include<cmath>
double n,a,b;
int main(){
scanf("%lf",&n);
for(int i=1;i<=10;++i){
scanf("%lf",&a);
if(abs(a*1000000)>abs(n*1000000)){
printf("%d",i);
return 0;
}
}
printf("GOOD");
return 0;
}
因为double有六位小数,所以我干脆右移小数点六位(
7-6 水仙花数 (10 分)
题面
请判断一个数是不是水仙花数。水仙花数是指各个数字立方和等于它本身的三位数。
输入格式:
有多组测试数据,每组测试数据以包含一个整数n(100<=n<1000)
输入0表示程序输入结束。
输出格式:
如果n是水仙花数就输出Yes
否则输出No
输入样例:
153
154
370
0
输出样例:
Yes
No
Yes
C++源码
#include<cstdio>
#include<cmath>
inline int read(){
int f=1,s=0;
char k=getchar();
while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
return f*s;
}
int n,a,b,n1,c;
int main(){
n=read();
while(n!=0)
{
n1=n;
b=0;
while(n>10){
a=n%10;
b+=a*a*a;
n/=10;
}
b+=n*n*n;
if(b==n1)printf("Yes\n");
else printf("No\n");
n=read();
}
return 0;
}
梦回初中,没想到第二次写到这道题是六年后,感慨
7-7 海选高大中锋 (10 分)
题面
HDU篮球队需要一个高大中锋,只要个子高,不会打球没关系。
请你从n个候选人找出个子最高的。
输入格式:
第1行包含一个整数n,表示人数。
第2行包含n个实数,表示n个人的身高。
输出格式:
包含一个实数,表示最高的人的身高,小数点保留2位。
输入样例:
在这里给出一组输入。例如:
10
161.01 226 180.76 175 177 165 158 150 170 171
输出样例:
226.00
C++源码
#include<cstdio>
#include<cmath>
int n;
double maxs,in;
int main(){
scanf("%d",&n);
maxs=0;
for(int i=1;i<=n;++i){
scanf("%lf",&in);
if(abs(maxs*100)<abs(in*100))maxs=in;
}
printf("%.2lf",maxs);
return 0;
}
7-8 谁先倒 (10 分)
题面
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(≤100),随后N行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中喊是喊出的数字,划是划出的数字,均为不超过100的正整数(两只手一起划)。
输出格式:
在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。
输入样例:
1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
输出样例:
A
1
C++源码
#include<cstdio>
#include<cmath>
inline int read(){
int f=1,s=0;
char k=getchar();
while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
return f*s;
}
int a,b,n,a1,b1,c1,d1,a2,b2;
int main(){
a=read(),b=read(),n=read();
for(int i=1;i<=n;++i){
a1=read(),b1=read(),c1=read(),d1=read();
if(((a1+c1)==b1)&&((a1+c1)==d1))continue;
if(((a1+c1)==b1)&&((a1+c1)!=d1))a2++;
if(((a1+c1)==d1)&&((a1+c1)!=b1))b2++;
if(a2==a+1||b2==b+1)break;
}
if(a2==a+1)printf("A\n%d",b2);
else if(b2==b+1)printf("B\n%d",a2);
return 0;
}
7-9 作品评分 (10 分)
题面
全国中小学生Scratch作品大赛拉开了序幕。每个参赛选手可以通过网络直接上传作品。本次比赛人人可做评委。每个网络评委可以通过网络对每一件作品进行打分。评分系统也是请程序高手设计的,能自动去掉一个最高分和一个最低分,求出平均分。
输入格式:
输入数据包括两行: 第一行为n,表示n个评委,n>2。
第二行是n个评委的打分,分数之间有一个空格。打分是可以带有小数部分的。
输出格式:
输出平均分,结果保留两位小数。
输入样例:
6
10 9 8 7.9 9 9.5
输出样例:
8.88
C++源码
#include<cstdio>
#include<cmath>
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
inline int read(){
int f=1,s=0;
char k=getchar();
while(k>'9'||k<'0'){if(k=='-')f=-1,k=getchar();}
while(k>='0'&&k<='9'){s=(s<<3)+(s<<1)+k-'0';k=getchar();}
return f*s;
}
int n,ans,n1;
double sum,ins,maxx,minx,ns;
int main(){
sum=0,maxx=0,minx=10.0;
scanf("%d",&n);
n1=n;
while(n){
scanf("%lf",&ins);
maxx=max(maxx,ins);
minx=min(minx,ins);
sum+=ins;
n--;
}
sum-=maxx,sum-=minx;
sum=sum/(n1-2);
printf("%.2lf",sum);
return 0;
}
本题一开始还想抖机灵,直接粗暴取前2位小数即可,结果调了半天发现除法不是inf就是nan的原因竟然是,我的n是0(麻了
本次练习的反思
我觉得最大的原因还是,我昨天晚上打狒狒14打到四点钟
早上也确实急功近利了,只能说金典老问题了
关于源码中read()函数的说明
read()函数为自行定义的一个快速读入整数的函数,不熟悉快读的朋友可以自行改为scanf()语句。