题解 | 桂林学院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;
}

编程题解集 文章被收录于专栏

编程比赛的题目集的题解

全部评论
这是蓝桥杯么?
点赞 回复 分享
发布于 2023-04-03 09:57 河南
这是什么性质的比赛?
点赞 回复 分享
发布于 2023-04-03 09:24 陕西

相关推荐

三题看不懂四题不明白二题无法AC&nbsp;T=int(input())&nbsp;for&nbsp;_&nbsp;in&nbsp;range(T):&nbsp;n=int(input())&nbsp;s=input().split()&nbsp;k,mx=1,1&nbsp;for&nbsp;i&nbsp;in&nbsp;range(len(s)-1):&nbsp;if&nbsp;len(s[i])&lt;len(s[i+1]):&nbsp;k+=1&nbsp;elif&nbsp;len(s[i])==len(s[i+1]):&nbsp;if&nbsp;s[i]&lt;=s[i+1]:&nbsp;k+=1&nbsp;...
恭喜臭臭猴子:第二题用栈就行。合法的括号直接出栈了,剩下的是不合法的,肯定都得一个一个走。出入栈的过程中得记下进栈的括号的下标。最后栈里剩下的括号如果相邻两个的下标不连续,说明它们中间有一个合法的括号序列被出栈,结果加一
投递拼多多集团-PDD等公司10个岗位 > 拼多多求职进展汇总 笔试
点赞 评论 收藏
分享
牛客ID:561366855:期望薪资多少?难以相信这简历找不到工作。说明二本电子信息专业想对口就业非常难。
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务