题解 | 桂林学院2023年天梯赛省赛排位赛
7-1 人生进度条
题目
2022年国家卫健委宣布我国人均预期寿命提高到77.93岁。现在以平均寿命78为基准,请输入你的年龄,输出你的人生进度条。
输入格式:
输入整数年龄。
输出格式:
输出占比,以%形式输出,保留两位小数。
(注意%的输出需要“%%”形式才能输出)
输入样例:
39
输出样例:
50.00%
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
将输入的年龄除78转换成浮点数输出就行(切记不要除77.93!!!)
用c的printf()函数输出小数比较方便
代码
#include<bits/stdc++.h> using namespace std; int main() { int a; double r,b=78; cin>>a; r=a*1.0/b; printf("%.2f%%",r*100); }
7-2 输入一个三位数的正整数,然后求该数的3个数字之和。
题目
输入一个三位数的正整数,然后求该数的3个数字之和。
输入格式:
输入一个三位数的正整数。例如:513
输出格式:
输出 这个数的3个数字之和。例如:513的3个数字之和是9
输入样例:
例如:
513
输出样例:
例如:
513的3个数字之和是9
输入样例:
例如:
103
输出样例:
例如:
103的3个数字之和是4
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
将三位数中的每个数提出来相加就行
提取数的方式有很多种,灵活运用 % 和 / 就行
代码
#include<bits/stdc++.h> using namespace std; int main() { int a,sum=0; cin>>a; sum=a/100+a/10%10+a%10; cout<<a<<"的3个数字之和是"<<sum; }
7-3 24小时制转12小时制
题目
请编写程序,输入 24 小时制的时间,输出 12 小时制时间。
输入格式
h:m:s (24 小时制的时间)
注:h 为时数(0 ~ 23),m 为分数(0 ~ 59),s 为秒数(0 ~ 59)。
输出格式
hh:mm:ss(am 或 pm)
其中:
- hh 为时数(01 ~ 12),mm 为分数(00 ~ 59),ss 为秒数(00 ~ 59),均为 2 位整数,若不足 2 位,则前面补 0。
- 若为上午,则显示 am,否则显示 pm。
输入样例1
10:12:5
输出样例1
10:12:05(am)
输入样例2
18:5:23
输出样例2
06:05:23(pm)
输入样例3
0:8:39
输出样例3
12:08:39(am)
输入样例4
12:35:3
输出样例4
12:35:03(pm)
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
主要是要考虑 0点(或者说24点)和 12点 的情况
用c中的printf()函数来输出比较方便
c语言中的 %02d 表示 如果输出的整型数不足两位,左侧用0补齐
代码
#include<bits/stdc++.h> using namespace std; int main() { int h,m,s; char c; cin>>h>>c>>m>>c>>s; if(h<12){ if(h==0){ h=12; } printf("%02d:%02d:%02d(am)",h,m,s); }else{ if(h!=12){ h-=12; } printf("%02d:%02d:%02d(pm)",h,m,s); } }
7-4 乱敲钟
题目
有大小两寺敲晨钟,报时警示时光匆,约定晨时同起声,大寺三分敲一下,小寺四时应一声,大小各敲十二通,一人居在两寺中,可闻多少晨钟声。
上面故事的意思是:有大小两座寺院敲晨钟用来报时,并且两座寺院都是在晨时开始敲钟。大寺院每3分钟敲一下,小寺院每4分钟敲一下,两座寺院各敲12下,居住在两座寺院中间的人能听到多少声钟声?答案很简单,21次。
这个题目太简单了,我们现在想弄个复杂点的。三个寺庙呈品字形排列,一个人站在三个寺庙连成的三角形的中心,离三个寺庙的距离相等。三个寺庙同时从0点开始敲钟,但是和尚每天的规律都不同,如果告诉你每个寺庙每天的敲钟间隔,以及敲钟的总数,你能知道站在中间的人总共能听到多少声钟声吗?
输入格式:
输入在一行中给出4个绝对值不超过1000的整数A,B,C,N,分别代表三个寺庙敲钟的间隔,N则是每个寺庙敲钟的次数。
输出格式:
对每一组输入,在一行中输出站在中间的人听到的钟声次数。
输入样例:
在这里给出一组输入。例如:
3 4 5 3
输出样例:
在这里给出相应的输出。例如:
7
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
其实本题不难,判断有寺庙敲钟就计数加一。
但要注意第一次敲钟是从0而不是1开始!!!
代码
#include<bits/stdc++.h> using namespace std; int main() { int a,b,c,n,max,sum=0,t=0; cin>>a>>b>>c>>n; max=a; if(max<b){ max=b; } if(max<c){ max=c; } for(int i=0;i<=max*n&&i<1440;i++){ if(i%a==0&&a*(n-1)>=i){ t++; } if(i%b==0&&b*(n-1)>=i){ t++; } if(i%c==0&&c*(n-1)>=i){ t++; } if(t>=1){ sum++; } t=0; } cout<<sum; }
7-5 斗牛
题目
牛年,三月中旬,周六,诺诺和诺爸玩起了“斗牛”纸牌游戏。斗牛玩法如下:对于一副扑克牌,每人发5张牌,根据牌面计算出各自是牛几(牛1,牛2,……,牛9,牛10),然后比较牛大小,牛大者胜,若牛一样大或者都无牛(牛0),则和局。牛几的计算方法:任取3张牌,把牌面值累加凑成10的倍数(若无法凑成则无牛),设剩下2张牌面值加起来的和S,若S为10的倍数则为牛10(双牛),否则用S(S小于10的情况)或用S减去10(S大于10的情况)的结果确定,例如,牌面4 3 4 6 10时,为牛7。牌面值为2至10,牌面A表示牌面值1,牌面为J、Q、K则按牌面值等于10对待。现在给你10张牌,前5张为诺诺的牌面,后5张为诺爸的牌面,请判断诺诺能否获胜。
输入格式:
首先输入一个整数T(1<=T<20),表示测试组数。 每组测试输入两行,每行5个牌面,或为数值2、3、4、5、6、7、8、9、10,或为字符A,J、Q、K,其中A表示牌面值为1、其他表示牌面值为10,数据之间以一个空格分隔。
输出格式:
对于每组测试,在一行上输出一个字符串,其中,“Win”表示诺诺胜,“Lose”表示诺诺败,“Draw”表示和局。引号不必输出。
输入样例:
2 8 5 5 K 10 A 2 7 4 4 A 2 2 6 A J 10 Q K A
输出样例:
Draw Win
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
在取值时需要注意,因为既有单个字符(1-9,A,J-K),也有两个字符(10),建议使用string,处理后存起来
判断点数需要先判断3张牌,再判断剩下2张牌。可以算出这两组值的和再运算
先算出5张牌的总和,再用双循环任选2张牌算出这2张牌的和,3张牌的和就是总和减去2张牌
判断3张牌的和是否能够取余10,如能,再判断2张牌的和,能够取余10点数就是10,不然点数就是取余10的结果
代码
#include<bits/stdc++.h> using namespace std; int main() { int n,a[5],b[5],sum1=0,sum2=0,max1=0,max2=0,t; string ch; cin>>n; while(n--){ for (int i = 0; i < 5; i++){ cin >> ch; if (ch[0] == 'A'){ a[i] = 1; }else if (ch[0] > 'A' || ch.size() == 2){ a[i] = 10; }else{ a[i] = (int)(ch[0] - '0'); } sum1+=a[i]; } for (int i = 0; i < 5; i++){ cin >> ch; if (ch[0] == 'A'){ b[i] = 1; }else if (ch[0] > 'A' || ch.size() == 2){ b[i] = 10; }else{ b[i] = (int)(ch[0] - '0'); } sum2+=b[i]; } for(int i=0;i<4;i++){ for(int j=i+1;j<5;j++){ if((sum1-a[i]-a[j])%10==0){ t=(a[i]+a[j])%10; if(t==0){ t=10; } if(t>max1){ max1=t; } } if((sum2-b[i]-b[j])%10==0){ t=(b[i]+b[j])%10; if(t==0){ t=10; } if(t>max2){ max2=t; } } } } if(max1>max2){ cout<<"Win"<<endl; }else if(max1==max2){ cout<<"Draw"<<endl; }else{ cout<<"Lose"<<endl; } sum1=0;sum2=0;max1=0;max2=0; } }
7-6 兔年大吉
题目
2023年1月22日,兔年初一。虎去兔来,祝各位安康顺意,兔年大吉。作为中国人,生肖大家都不陌生。对于给定的一个年份,请输出该年份对应的生肖(以英文单词表示,详见最后的提示)。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入1个年份year(1000<=year<10000)。
输出格式:
对于每组测试,在一行上输出年份year对应的生肖。
输入样例:
3 2022 2023 2024
输出样例:
tiger rabbit dragon
提示:
鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪等十二生肖相应的英文单词如下:
rat、ox、tiger、rabbit、dragon、snake、horse、goat、monkey、rooster、dog、pig
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
用字符串按顺序存起来生肖所对应英文单词,计算年份后再输出字符串对应下标的值。
要注意0年并不是鼠年哦,得要稍微处理一下
代码
#include<bits/stdc++.h> using namespace std; int main() { int n; string a[12]={"rat","ox","tiger","rabbit","dragon","snake","horse","goat","monkey","rooster","dog","pig"}; cin>>n; for(int i=0;i<n;i++){ cout<<a[(m+8)%12]<<endl; } }
7-7 病例统计
题目
某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-14、15-18、19-60、61以上(含61)四个年龄段统计的患病人数占总患病人数的比例。
输入格式:
共2行,第一行为过往病人的数目n(0 < n <= 100),第二行为每个病人患病时的年龄。输入保证年龄大于等于0, 小于等于150。
输出格式:
0-14、15-18、19-60、61以上(含61)四个年龄段输出该段患病人数占总患病人数的比例,以小数形式输出,精确到小数点后两位。每个年龄段占一行,共四行。
输入样例:
在这里给出一组输入。例如:
10 1 11 21 31 41 18 61 71 81 91
输出样例:
在这里给出相应的输出。例如:
0.20 0.10 0.30 0.40
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
虽然20分,但是不难。循环取值时记录对应年龄段的人数,再除总人数n就行(记得浮点数处理)
用c的printf()函数输出小数比较方便
代码
#include<bits/stdc++.h> using namespace std; int main() { int n,m[105],a=0,b=0,c=0,d=0; cin>>n; for(int i=0;i<n;i++){ cin>>m[i]; if(m[i]<=14){ a++; }else if(m[i]<=18){ b++; }else if(m[i]<=60){ c++; }else{ d++; } } printf("%.2f\n",a*1.0/n); printf("%.2f\n",b*1.0/n); printf("%.2f\n",c*1.0/n); printf("%.2f",d*1.0/n); }
7-8 炮兵轰炸
题目
炮兵接到命令对指定区域进行炮击。假设敌方士兵分布在一个M×N格的二维平面上,每名士兵占据一格。向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意:
O OXO O
其中,X为炮弹落点中心,O为紧靠中心的四个有杀伤力的格子范围。若士兵被炮弹命中(位于X格),一击毙命,若仅被杀伤(位于O格),则损失一半的生命力。也就是说,一次命中或者两次杀伤均可消灭敌方士兵。现在给出士兵的分布情况以及连续k发炮弹的落点,给出每炮消灭的士兵数。最后给出被消灭的士兵总数、受伤的士兵总数。
输入格式:
第一行为两个不超过20的正整数M和N,中间空一格,表示二维平面有M行、N列。
接下来M行,每行有N个0或者#字符,其中#表示所在格子有士兵。
接下来一行,包含一个不超过100的正整数k,表示发射炮弹的数量。
最后k行,每行包括一发炮弹的整数坐标x和y(0≤x<M,0≤y<N),之间用一个空格间隔。
输出格式:
对应输入的k发炮弹,输出k行,第i行即第i发炮弹消灭的士兵数。
然后另起一行输出总的消灭士兵数、受伤士兵数。两者用空格隔开。
输入样例:
5 5 00### 0##00 00#00 ##000 #0#0# 3 0 2 1 1 1 2
输出样例:
1 2 0 3 2
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路
可以用字符数组或数组来处理(建议使用数组,好处理判断一点)
判断炮弹落点及落点上下左右共5个格子就行,要注意边界
代码
数组方式处理
#include<bits/stdc++.h> using namespace std; int main() { int n,m,k,x,y,sumkill=0,sumattack=0,nowkill=0,a[21][21]={0}; char c; cin>>m>>n; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cin>>c; if(c=='#'){ a[i][j]=2; } } } cin>>k; while(k--){ cin>>x>>y; if(a[x][y]!=0){ if(a[x][y]==1){ sumattack--; } a[x][y]=0; sumkill++; nowkill++; } for(int i=-1;i<=1;i+=2){ if(x+i>=0&&x+i<=m-1){ if(a[x+i][y]==2){ a[x+i][y]--; sumattack++; }else if(a[x+i][y]==1){ a[x+i][y]--; sumkill++; nowkill++; sumattack--; } } } for(int i=-1;i<=1;i+=2){ if(y+i>=0&&y+i<=n-1){ if(a[x][y+i]==2){ a[x][y+i]--; sumattack++; }else if(a[x][y+i]==1){ a[x][y+i]--; sumkill++; nowkill++; sumattack--; } } } cout<<nowkill<<endl; nowkill=0; } cout<<sumkill<<" "<<sumattack<<endl; }
字符数组方式处理
#include<bits/stdc++.h> using namespace std; int main() { int n,m,k,x,y,sumkill=0,nowkill=0,sumattack=0; char a[21][21]={'0'}; cin>>m>>n; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ cin>>a[i][j]; } } cin>>k; while(k--){ cin>>x>>y; if(a[x][y]!='0'){ if(a[x][y]=='1'){ sumattack--; } a[x][y]='0'; sumkill++; nowkill++; } for(int i=-1;i<=1;i+=2){ if(x+i>=0&&x+i<=m-1){ if(a[x+i][y]=='#'){ a[x+i][y]='1'; sumattack++; }else if(a[x+i][y]=='1'){ a[x+i][y]='0'; sumkill++; nowkill++; sumattack--; } } } for(int i=-1;i<=1;i+=2){ if(y+i>=0&&y+i<=n-1){ if(a[x][y+i]=='#'){ a[x][y+i]='1'; sumattack++; }else if(a[x][y+i]=='1'){ a[x][y+i]='0'; sumkill++; nowkill++; sumattack--; } } } cout<<nowkill<<endl; nowkill=0; } cout<<sumkill<<" "<<sumattack<<endl; }
编程比赛的题目集的题解