GPLT团体程序设计天梯赛-练习集 L1-061~L1-072

L1-061 新胖子公式 (10 分)


根据钱江晚报官方微博的报导,最新的肥胖计算方法为:体重(kg) / 身高(m) 的平方。如果超过 25,你就是胖子。于是本题就请你编写程序自动判断一个人到底算不算胖子。


输入格式

输入在一行中给出两个正数,依次为一个人的体重(以 kg 为单位)和身高(以 m 为单位),其间以空格分隔。其中体重不超过 \(1000\) kg,身高不超过 \(3.0\) m。


输出格式

首先输出将该人的体重和身高代入肥胖公式的计算结果,保留小数点后 \(1\) 位。如果这个数值大于 \(25\),就在第二行输出 PANG,否则输出 Hai Xing


输入样例 1

100.1 1.74

输出样例 1

33.1
PANG

输入样例 2

65 1.70

输出样例 2

22.5
Hai Xing

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

using namespace std;
double kg,m,bmi;
int main(){
	scanf("%lf %lf",&kg,&m);
	printf("%.1lf\n",bmi=kg/(m*m));
	if(bmi>25) puts("PANG");
	else puts("Hai Xing");
	return 0;
}






L1-062 幸运彩票 (15 分)


彩票的号码有 6 位数字,若一张彩票的前 3 位上的数之和等于后 3 位上的数之和,则称这张彩票是幸运的。本题就请你判断给定的彩票是不是幸运的。


输入格式

输入在第一行中给出一个正整数 N(≤ 100)。随后 N 行,每行给出一张彩票的 6 位数字。


输出格式

对每张彩票,如果它是幸运的,就在一行中输出 You are lucky!;否则输出 Wish you good luck.


输入样例

2
233008
123456

输出样例

You are lucky!
Wish you good luck.

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<cstdio>
#include<iostream>
using namespace std;
int main(){
	int n;
	scanf("%d",&n);
	while(n--){
		string s;
		cin>>s;
		if(s[0]+s[1]+s[2] == s[3]+s[4]+s[5]) puts("You are lucky!");
		else puts("Wish you good luck.");
	}
	return 0;
}






L1-063 吃鱼还是吃肉 (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!

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<cstdio>
#include<iostream>
using namespace std;
int main(){
	int n,S,H,W;
	scanf("%d",&n);
	while(n--){
		scanf("%d %d %d",&S,&H,&W);
		if(S==1){
			if(H<130) printf("duo chi yu! ");
			if(H==130) printf("wan mei! ");
			if(H>130) printf("ni li hai! ");
			if(W<27) printf("duo chi rou!\n");
			if(W==27) printf("wan mei!\n");
			if(W>27) printf("shao chi rou!\n");
		}
		if(S==0){
			if(H<129) printf("duo chi yu! ");
			if(H==129) printf("wan mei! ");
			if(H>129) printf("ni li hai! ");
			if(W<25) printf("duo chi rou!\n");
			if(W==25) printf("wan mei!\n");
			if(W>25) printf("shao chi rou!\n");
		}
	}
	return 0;
}






L1-064 估值一亿的AI核心代码 (20 分)


以上图片来自新浪微博。

本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是:

  • 无论用户说什么,首先把对方说的话在一行中原样打印出来;
  • 消除原文中多余空格:把相邻单词间的多个空格换成 \(1\) 个空格,把行首尾的空格全部删掉,把标点符号前面的空格删掉;
  • 把原文中所有大写英文字母变成小写,除了 I
  • 把原文中所有独立的 can youcould you 对应地换成 I canI could—— 这里“独立”是指被空格或标点符号分隔开的单词;
  • 把原文中所有独立的 Ime 换成 you
  • 把原文中所有的问号 ? 换成惊叹号 !
  • 在一行中输出替换后的句子作为 AI 的回答。

输入格式

输入首先在第一行给出不超过 \(10\) 的正整数 N,随后 N 行,每行给出一句不超过 \(1000\) 个字符的、以回车结尾的用户的对话,对话为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。


输出格式

按题面要求输出,每个 AI 的回答前要加上 AI: 和一个空格。


输入样例

6
Hello ?
 Good to chat   with you
can   you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know

输出样例:

Hello ?
AI: hello!
 Good to chat   with you
AI: good to chat with you
can   you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



本题的模拟略微复杂,代码可能比较凌乱,请见谅;


PZ.cpp

#include<cstdio>
#include<iostream>
#include<sstream>
using namespace std;
int n;
void work2(string &s){
	for(int i=0;i<s.size();++i)
		if('A'<=s[i] && s[i]<='Z' && s[i]!='I') s[i]=s[i]-'A'+'a';
}
string work1(string s){
	istringstream iss(s);
	string tmp,res;
	bool f=0;
	while(getline(iss,tmp,' ')){
		if(tmp=="") continue;
		work2(tmp);
		if(!f) res+=tmp,f=1;
		else res+=" "+tmp;
	}
	return res;
}

bool isabc(char x){ return x=='I' || 'a'<=x && x<='z' || '0'<=x && x<='9'; }

void work3(string s){
	for(int i=0;i<s.size();++i){
		if((i==0 || !isabc(s[i-1])) && (s[i]=='I') && !isabc(s[i+1])) cout<<"you";
		else if((i==0 || !isabc(s[i-1])) && s[i]=='m' && s[i+1]=='e' && !isabc(s[i+2])) cout<<"you",++i;
		else if((i==0 || !isabc(s[i-1])) && s[i]=='c' && s[i+1]=='a' && s[i+2]=='n' && s[i+3]==' ' && s[i+4]=='y' && s[i+5]=='o' && s[i+6]=='u' && !isabc(s[i+7])) cout<<"I can",i+=6;
		else if((i==0 || !isabc(s[i-1])) && s[i]=='c' && s[i+1]=='o' && s[i+2]=='u' && s[i+3]=='l' && s[i+4]=='d' && s[i+5]==' ' && s[i+6]=='y' && s[i+7]=='o' && s[i+8]=='u' && !isabc(s[i+9])) cout<<"I could",i+=8;
		else if(s[i]=='?') cout<<'!';
		else if(s[i]==' ' && !isabc(s[i+1])) continue;
		else cout<<s[i];
	}
	puts("");
}
int main(){
	scanf("%d",&n); getchar();
	while(n--){
		string s;
		getline(cin,s);
		
		cout<<s<<endl;
		
		s=work1(s);
		
		cout<<"AI: ";
		work3(s);
	}
	return 0;
}






L1-065 嫑废话上代码 (5 分)


Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。


输入格式

本题没有输入。


输出格式

在一行中输出 Talk is cheap. Show me the code.


输入样例


输出样例

Talk is cheap. Show me the code.

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<cstdio>
using namespace std;
int main(){
	printf("Talk is cheap. Show me the code.");
	return 0;
}






L1-066 猫是液体 (5 分)


测量一个人的体积是很难的,但猫就不一样了。因为猫是液体,所以可以很容易地通过测量一个长方体容器的容积来得到容器里猫的体积。本题就请你完成这个计算。


输入格式

输入在第一行中给出 \(3\) 个不超过 \(100\) 的正整数,分别对应容器的长、宽、高。


输出格式

在一行中输出猫的体积。


输入样例

23 15 20

输出样例

6900

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<cstdio>
using namespace std;
int main(){
	int x,y,z;
	scanf("%d %d %d",&x,&y,&z);
	printf("%d",x*y*z);
	return 0;
}






L1-067 洛希极限 (10 分)


科幻电影《流浪地球》中一个重要的情节是地球距离木星太近时,大气开始被木星吸走,而随着不断接近地木“刚体洛希极限”,地球面临被彻底撕碎的危险。但实际上,这个计算是错误的。

洛希极限(Roche limit)是一个天体自身的引力与第二个天体造成的潮汐力相等时的距离。当两个天体的距离少于洛希极限,天体就会倾向碎散,继而成为第二个天体的环。它以首位计算这个极限的人爱德华·洛希命名。(摘自百度百科)

大天体密度与小天体的密度的比值开 \(3\) 次方后,再乘以大天体的半径以及一个倍数(流体对应的倍数是 \(2.455\),刚体对应的倍数是 \(1.26\)),就是洛希极限的值。例如木星与地球的密度比值开 \(3\) 次方是 \(0.622\),如果假设地球是流体,那么洛希极限就是 \(0.622×2.455=1.52701\) 倍木星半径;但地球是刚体,对应的洛希极限是 \(0.622×1.26=0.78372\) 倍木星半径,这个距离比木星半径小,即只有当地球位于木星内部的时候才会被撕碎,换言之,就是地球不可能被撕碎。

本题就请你判断一个小天体会不会被一个大天体撕碎。


输入格式

输入在一行中给出 \(3\) 个数字,依次为:大天体密度与小天体的密度的比值开 \(3\) 次方后计算出的值(\(≤1\))、小天体的属性(\(0\) 表示流体、\(1\) 表示刚体)、两个天体的距离与大天体半径的比值(\(>1\) 但不超过 \(10\))。


输出格式

在一行中首先输出小天体的洛希极限与大天体半径的比值(输出小数点后\(2\)位);随后空一格;最后输出 ^_^ 如果小天体不会被撕碎,否则输出 T_T


输入样例 1

0.622 0 1.4

输出样例 1

1.53 T_T

输入样例 2

0.622 1 1.4

输出样例 2

0.78 ^_^

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<cstdio>
using namespace std;
int main(){
	double x,y,z,ans;
	scanf("%lf %lf %lf",&x,&y,&z);
	ans=x*(y==0 ? 2.455 : 1.26);
	printf("%.2lf ",ans);
	if(ans<z) puts("^_^"); else puts("T_T");
	return 0;
}






L1-068 调和平均 (10 分)


\(N\) 个正数的算数平均是这些数的和除以 \(N\),它们的调和平均是它们倒数的算数平均的倒数。本题就请你计算给定的一系列正数的调和平均值。


输入格式

每个输入包含 \(1\) 个测试用例。每个测试用例第 \(1\) 行给出正整数 \(N (≤1000)\);第 \(2\) 行给出 \(N\) 个正数,都在区间 \([0.1,100]\) 内。


输出格式

在一行中输出给定数列的调和平均值,输出小数点后\(2\)位。


输入样例

8
10 15 12.7 0.3 4 13 1 15.6

输出样例

1.61

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<cstdio>
using namespace std;
int main(){
	int n;
	double sum=0;
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		double x;
		scanf("%lf",&x);
		sum+=1/x;
	}
	printf("%.2lf",1/(sum/n));
	return 0;
}






L1-069 胎压监测 (15 分)


小轿车中有一个系统随时监测四个车轮的胎压,如果四轮胎压不是很平衡,则可能对行车造成严重的影响。

让我们把四个车轮 —— 左前轮、右前轮、右后轮、左后轮 —— 顺次编号为 1、2、3、4。本题就请你编写一个监测程序,随时监测四轮的胎压,并给出正确的报警信息。报警规则如下:

  • 如果所有轮胎的压力值与它们中的最大值误差在一个给定阈值内,并且都不低于系统设定的最低报警胎压,则说明情况正常,不报警;
  • 如果存在一个轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则不仅要报警,而且要给出可能漏气的轮胎的准确位置;
  • 如果存在两个或两个以上轮胎的压力值与它们中的最大值误差超过了阈值,或者低于系统设定的最低报警胎压,则报警要求检查所有轮胎。

输入格式

输入在一行中给出 6 个 [0, 400] 范围内的整数,依次为 1~4 号轮胎的胎压、最低报警胎压、以及胎压差的阈值。


输出格式

根据输入的胎压值给出对应信息:

  • 如果不用报警,输出 Normal
  • 如果有一个轮胎需要报警,输出 Warning: please check #X!,其中 X 是出问题的轮胎的编号;
  • 如果需要检查所有轮胎,输出 Warning: please check all the tires!

输入样例 1

242 251 231 248 230 20

输出样例 1

Normal

输入样例 2

242 251 232 248 230 10

输出样例 2

Warning: please check #3!

输入样例 3

240 251 232 248 240 10

输出样例 3

Warning: please check all the tires!

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<cstdio>
#include<algorithm>
using namespace std;
int s[5],Min,P,cnt,pos,Max;
int main(){
	scanf("%d %d %d %d %d %d",&s[1],&s[2],&s[3],&s[4],&Min,&P);
	Max=max(s[1],max(s[2],max(s[3],s[4])));
	for(int i=1;i<=4;++i)
		if(Max-s[i]>P || s[i]<Min) ++cnt,pos=i;
	if(cnt==0) puts("Normal");
	else if(cnt==1) printf("Warning: please check #%d!",pos);
	else puts("Warning: please check all the tires!");
	return 0;
}






L1-070 吃火锅 (15 分)


以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 chi1 huo3 guo1


输入格式

输入每行给出一句不超过 80 个字符的、以回车结尾的朋友信息,信息为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。当读到某一行只有一个英文句点 . 时,输入结束,此行不算在朋友信息里。


输出格式

首先在一行中输出朋友信息的总条数。然后对朋友的每一行信息,检查其中是否包含 chi1 huo3 guo1,并且统计这样厉害的信息有多少条。在第二行中首先输出第一次出现 chi1 huo3 guo1 的信息是第几条(从 1 开始计数),然后输出这类信息的总条数,其间以一个空格分隔。题目保证输出的所有数字不超过 100。

如果朋友从头到尾都没提 chi1 huo3 guo1 这个关键词,则在第二行输出一个表情 -_-#


输入样例 1

Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.

输出样例 1

5
3 2

输入样例 2

Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.

输出样例 2

5
-_-#

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
string s;
int sum,pos,cnt;
int main(){
	while(getline(cin,s) && s!="."){
		++sum;
		if(s.find("chi1 huo3 guo1")!=-1){
			if(!pos) pos=sum;
			++cnt;
		}
	}
	printf("%d\n",sum);
	if(cnt) printf("%d %d",pos,cnt);
	else puts("-_-#");
	return 0;
}






L1-071 前世档案 (20 分)


网络世界中时常会遇到这类滑稽的算命小程序,实现原理很简单,随便设计几个问题,根据玩家对每个问题的回答选择一条判断树中的路径(如下图所示),结论就是路径终点对应的那个结点。

现在我们把结论从左到右顺序编号,编号从 1 开始。这里假设回答都是简单的“是”或“否”,又假设回答“是”对应向左的路径,回答“否”对应向右的路径。给定玩家的一系列回答,请你返回其得到的结论的编号。

输入格式:

输入第一行给出两个正整数:N(≤30)为玩家做一次测试要回答的问题数量;M(≤100)为玩家人数。

随后 M 行,每行顺次给出玩家的 N 个回答。这里用 y 代表“是”,用 n 代表“否”。

输出格式:

对每个玩家,在一行中输出其对应的结论的编号。

输入样例:

3 4
yny
nyy
nyn
yyn

输出样例:

3
5
6
2

作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ's Solution

1.本题可以转换为在一棵二叉树上移动,输出最底层的结点号即可;

2.可以直接套用二叉树编号,这样 最后一层的结点号\(-2^{n}+1\) 即为答案;


PZ.cpp

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m;
string s;
int dfs(int x,int o){
	if(x==n) return o;
	if(s[x]=='y') dfs(x+1,o<<1);
	else dfs(x+1,o<<1|1);
}
int main(){
	scanf("%d %d",&n,&m);
	while(m--){
		cin>>s;
		printf("%d\n",dfs(0,1)-(int)pow(2,n)+1);
	}
	return 0;
}






L1-072 刮刮彩票 (20 分)


“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示:

每次游戏玩家会拿到一张彩票,上面会有 \(9\) 个数字,分别为数字 \(1\) 到数字 \(9\),数字各不重复,并以 \(3×3\) 的“九宫格”形式排布在彩票上。

在游戏开始时能看见一个位置上的数字,其他位置上的数字均不可见。你可以选择三个位置的数字刮开,这样玩家就能看见四个位置上的数字了。最后玩家再从 \(3\) 横、\(3\) 竖、\(2\) 斜共 \(8\) 个方向中挑选一个方向,方向上三个数字的和可根据下列表格进行兑奖,获得对应数额的金币。

数字合计 获得金币 数字合计 获得金币
6 10,000 16 72
7 36 17 180
8 720 18 119
9 360 19 36
10 80 20 306
11 252 21 1,080
12 108 22 144
13 72 23 1,800
14 54 24 3,600
15 180

现在请你写出一个模拟程序,模拟玩家的游戏过程。


输入格式

输入第一部分给出一张合法的彩票,即用 3 行 3 列给出 0 至 9 的数字。0 表示的是这个位置上的数字初始时就能看见了,而不是彩票上的数字为 0。

第二部给出玩家刮开的三个位置,分为三行,每行按格式 x y 给出玩家刮开的位置的行号和列号(题目中定义左上角的位置为第 1 行、第 1 列。)。数据保证玩家不会重复刮开已刮开的数字。

最后一部分给出玩家选择的方向,即一个整数: 1 至 3 表示选择横向的第一行、第二行、第三行,4 至 6 表示纵向的第一列、第二列、第三列,7、8分别表示左上到右下的主对角线和右上到左下的副对角线。


输出格式

对于每一个刮开的操作,在一行中输出玩家能看到的数字。最后对于选择的方向,在一行中输出玩家获得的金币数量。


输入样例

1 2 3
4 5 6
7 8 0
1 1
2 2
2 3
7

输出样例

1
5
6
180

作者:DAI, Longao
单位:杭州百腾教育科技有限公司
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB



PZ.cpp

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int mp[4][4],num,ans,px,py,C[25]={0,0,0,0,0,0,10000,36,720,360,80,252,108,72,54,180,72,180,119,36,306,1080,144,1800,3600};
bool vis[10];
int main(){
	for(int i=1;i<=3;++i)
		for(int j=1;j<=3;++j){
			scanf("%d",&mp[i][j]);
			if(mp[i][j]==0) px=i,py=j;
			vis[mp[i][j]]=1;
		}
	for(int i=1;i<=9;++i) if(!vis[i]) mp[px][py]=i;
	for(int x,y,i=1;i<=3;++i){
		scanf("%d %d",&x,&y);
		printf("%d\n",mp[x][y]);
	}
	scanf("%d",&num);
	if(1<=num && num<=3) ans=mp[num][1]+mp[num][2]+mp[num][3];
	if(4<=num && num<=6) ans=mp[1][num-3]+mp[2][num-3]+mp[3][num-3];
	if(num==7) ans=mp[1][1]+mp[2][2]+mp[3][3];
	if(num==8) ans=mp[1][3]+mp[2][2]+mp[3][1];
	printf("%d",C[ans]);
	return 0;
}
posted @ 2021-04-01 10:29  PotremZ  阅读(951)  评论(0编辑  收藏  举报