团队天梯赛练习题题解 L1-031~L1-040
前情提要,Python题解思路基本写在代码,新老博客夹杂写出的,风格不统一也正常
两个人思路不一样也很正常,两种思路都可以的,不一定只有这种实现
L1-031 到底是不是太胖了 (10 分)
据说一个人的标准体重应该是其身高(单位:厘米)减去、再乘以所得到的公斤数。真实体重与标准体重误差在以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
输入格式
输入第一行给出一个正整数N。随后N行,每行给出两个整数,分别是一个人的身高 H H ;单位:厘米)和真实体重W W ;单位:市斤),其间以空格分隔。
输出格式
为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。
输入样例
3
169 136
150 81
178 155输出样例
You are wan mei!
You are tai shou le!
You are tai pang le!作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ の C++ 解決策
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int n,h,w; scanf("%d",&n);
while(n--){
scanf("%d %d",&h,&w);
double Ew=(h-100)*0.9*2;
if(fabs(w-Ew)<Ew*0.1) puts("You are wan mei!");
else if(w>Ew) puts("You are tai pang le!");
else puts("You are tai shou le!");
}
return 0;
}winterl の Python 解決策
for _ in range(int(input())):
height, weight = map(int, input().split())
weight /= 2 # 千万记得 斤 转成 公斤
# 按照题目给的公式计算标准体重
standard_weight = (height - 100) * 0.9
if abs(weight - standard_weight) < standard_weight * 0.1:
print("You are wan mei!")
# 这里题目没说清楚具体怎么判断,但是可以证明就是,体重大于标准体重就是胖
elif weight > standard_weight:
print("You are tai pang le!")
else:
print("You are tai shou le!")L1-032 Left-pad (20 分)
根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的模块?就是在字符串前填充一些东西到一定的长度。例如用*去填充字符串GPLT,使之长度为10,调用left-pad的结果就应该是******GPLT。Node社区曾经对left-pad紧急发布了一个替代,被严重吐槽。下面就请你来实现一下这个模块。
输入格式
输入在第一行给出一个正整数N和一个字符,分别是填充结果字符串的长度和用于填充的字符,中间以个空格分开。第二行给出原始的非空字符串,以回车结束。
输出格式
在一行中输出结果字符串。
输入样例1
15 _
I love GPLT输出样例1
____I love GPLT输入样例2
4 *
this is a sample for cut输出样例2
cut作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ’s Solution
-
对于长度不足的字符串,用 给定字符补齐;
-
对于长度符合要求的字符串,给出最后
N个字符即可;
PotremZ の C++ 解決策
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n; char ch; string s;
scanf("%d %c\n",&n,&ch);
getline(cin,s);
int len=s.size();
if(len>=n){
string ans="";
for(int i=len-1;i>=len-n;--i) ans=s[i]+ans;
cout<<ans;
}else{
for(int i=1;i<=n-len;++i) cout<<ch;
cout<<s;
}
return 0;
}winterl の Python 解決策
count, symbol = input().split()
message = input()
# 记得用字符串切片或者别的办法去除多余字符
message = message[-min(int(count), len(message)) :]
# 直接利用 格式化字符串 生成 答案的格式化字符串
# 比如样例一 `15 _` 会给出 => "{:_>15}"
message_format = f"{{:{symbol}>{count}}}"
# 然后再用格式化字符串之间格式就好了
print(message_format.format(message))L1-033 出生年 (15 分)

以上是新浪微博中一奇葩贴:“我出生于年,直到岁才遇到个数字都不相同的年份。”也就是说,直到年才达到“个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。
输入格式
输入在一行中给出出生年份y和目标年份中不同数字的个数n,其中y在之间,n可以是、或、或。注意不足位的年份要在前面补零,例如公元年被认为是年,有个不同的数字和。
输出格式
根据输入,输出x和能达到要求的年份。数字间以个空格分隔,行首尾不得有多余空格。年份要按位输出。注意:所谓“n个数字都不相同”是指不同的数字正好是n个。如“”被视为满足“位数字都不同”的条件,但不被视为满足位或位数字不同的条件。
输入样例1
1988 4输出样例1
25 2013输入样例2
1 2输出样例2
0 0001作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ の C++ 解決策
#include<cstdio>
int check(int x){
bool num[10]={0};
if(x<1000) num[0]=1;
while(x){
num[x%10]=1;
x/=10;
}
int res=0;
for(int i=0;i<=9;++i) if(num[i]) ++res;
return res;
}
int main(){
int y,n; scanf("%d %d",&y,&n);
for(int x=y;;++x){
if(check(x)==n){
printf("%d %04d",x-y,x);
return 0;
}
}
return 0;
}winterl の Python 解決策
both, count = map(int, input().split())
used, current = 0, both
# 不知道数的范围,用一个死循环暴力查找
while True:
# 记得不足 4 位补 0,这是一个坑
# 很明显,集合中元素的个数等于题目要求就是找到了
if len(set(f"{current:0>4}")) == count:
break
used += 1
current += 1
# 输出也记得补
print(used, f"{current:0>4}")L1-034 点赞 (20 分)
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。本题就要求你写个程序,通过统计一个人点赞的纪录,分析这个人的特性。
输入格式
输入在第一行给出一个正整数,是该用户点赞的博文数量。随后行,每行给出一篇被其点赞的博文的特性描述,格式为,其中,是特性标签的编号,我们将所有特性标签从到编号。数字间以空格分隔。
输出格式
统计所有被点赞的博文中最常出现的那个特性标签,在一行中输出它的编号和出现次数,数字间隔个空格。如果有并列,则输出编号最大的那个。
输入样例
4
3 889 233 2
5 100 3 233 2 73
4 3 73 889 2
2 233 123输出样例
233 3作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:200 ms
内存限制:64 MB
PotremZ の C++ 解決策
#include<cstdio>
#include<climits>
int maxf=-INT_MAX,maxfnum=-INT_MAX,num[1001];
int main(){
int n; scanf("%d",&n);
for(int k,f,i=1;i<=n;++i){
scanf("%d",&k);
for(int j=1;j<=k;++j){
scanf("%d",&f);
++num[f];
if(num[f]>maxfnum || (maxfnum==num[f]&&f>maxf)){
maxfnum=num[f];
maxf=f;
}
}
}
printf("%d %d",maxf,maxfnum);
return 0;
}winterl の Python 解決策
from collections import defaultdict
# 提供默认值,方便使用
label_map = defaultdict(int)
for _ in range(int(input())):
# 这里踩坑了,记得转换成整数,不然后面比较的时候用字符串排序就炸了
for label in map(int, input().split()[1:]):
# 记录每个标签出现的次数
label_map[label] += 1
# 记得这里要反过来键值对,是先找次数最大,再找标签最大!
times, label = max(zip(label_map.values(), label_map.keys()))
print(label, times)L1-035 情人节 (15 分)

以上是朋友圈中一奇葩贴:“月情人节了,我决定造福大家。第个赞和第个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出那两位要请客的倒霉蛋。
输入格式
输入按照点赞的先后顺序给出不知道多少个点赞的人名,每个人名占一行,为不超过个英文字母的非空单词,以回车结束。一个英文句点.标志输入的结束,这个符号不算在点赞名单里。
输出格式
根据点赞情况在一行中输出结论:若存在第个人和第个人,则输出A and B are inviting you to dinner...;若只有没有,则输出A is the only one for you...;若连都没有,则输出Momo... No one is for you ...。
输入样例1
GaoXZh
Magi
Einst
Quark
LaoLao
FatMouse
ZhaShen
fantacy
latesum
SenSen
QuanQuan
whatever
whenever
Potaty
hahaha
.输出样例1
Magi and Potaty are inviting you to dinner...输入样例2
LaoLao
FatMouse
whoever
.输出样例2
FatMouse is the only one for you...输入样例3
LaoLao
.输出样例3
Momo... No one is for you ...作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ の C++ 解決策
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
string s,num[15]=""; int cnt=0;
while(cin>>s&&s!="."){ num[++cnt]=s; if(cnt>=14) break; }
if(cnt>=14) cout<<num[2]<<" and "<<num[14]<<" are inviting you to dinner...";
else if(cnt>=2) cout<<num[2]<<" is the only one for you...";
else cout<<"Momo... No one is for you ...";
return 0;
}winterl の Python 解決策
# 处理输入,我们可以用一个死循环和一个列表动态完成
names = []
while True:
name = input()
if name == ".":
break
names.append(name)
# 记得利用 set 去重,这是一个坑
name = list(set(names))
count = len(names)
# 格式化字符串打印即可
if count < 2:
print("Momo... No one is for you ...")
elif count < 14:
print(f"{names[1]} is the only one for you...")
else:
print(f"{names[1]} and {names[13]} are inviting you to dinner...")L1-036 A乘以B (5 分)
看我没骗你吧 —— 这是一道你可以在 秒内完成的题:给定两个绝对值不超过 的整数 和 ,输出 乘以 的值。
输入格式
输入在第一行给出两个整数 和 ,数字间以空格分隔。
输出格式
在一行中输出 乘以 的值。
输入样例
-8 13输出样例
-104作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ の C++ 解決策
#include<cstdio>
int main(){
int a,b;
scanf("%d %d",&a,&b);
printf("%d",a*b);
return 0;
}winterl の Python 解決策
# a * b 问题 不整活了(其实可以搞个龟速乘玩)
a, b = map(int, input().split())
print(a * b)L1-037 A除以B (10 分)
真的是简单题哈 —— 给定两个绝对值不超过100的整数A和B,要求你按照“A/B=商”的格式输出结果。
输入格式
输入在第一行给出两个整数和,数字间以空格分隔。
输出格式
在一行中输出结果:如果分母是正数,则输出A/B=商;如果分母是负数,则要用括号把分母括起来输出;如果分母为零,则输出的商应为Error。输出的商应保留小数点后位。
输入样例1
-1 2输出样例1
-1/2=-0.50输入样例2
1 -3输出样例2
1/(-3)=-0.33输入样例3
5 0输出样例3
5/0=Error作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ の C++ 解決策
#include<cstdio>
int main(){
int a,b;
scanf("%d %d",&a,&b);
if(b<0) printf("%d/(%d)=%.2lf",a,b,1.0*a/b);
else if(b==0) printf("%d/%d=Error",a,b);
else printf("%d/%d=%.2lf",a,b,1.0*a/b);
return 0;
}winterl の Python 解決策
a, b = map(int, input().split())
if b == 0:
print(f"{a}/{b}=Error")
elif b < 0:
# 随便一个格式化字符串,怎么喜欢怎么来
print(f"{a}/({b})={a/b:.2f}")
else:
print(f"{a}/{b}={a/b:.2f}")L1-038 新世界 (5 分)
这道超级简单的题目没有任何输入。
你只需要在第一行中输出程序员钦定名言Hello World,并且在第二行中输出更新版的Hello New World就可以了。
输入样例
无输出样例
Hello World
Hello New World作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ の C++ 解決策
#include<cstdio>
int main(){
printf("Hello World\nHello New World");
return 0;
}winterl の Python 解決策
# 签到玩法
# print(
# """Hello World
# Hello New World"""
# )
# 整活玩法 (Hex编码)
data_bytes = bytes.fromhex("48656c6c6f20576f726c640a48656c6c6f204e657720576f726c64")
print("".join(list(map(lambda byte: str(chr(byte)), data_bytes))))L1-039 古风排版 (20 分)
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式
输入在第一行给出一个正整数,是每一列的字符数。第二行给出一个长度不超过的非空字符串,以回车结束。
输出格式
按古风格式排版给定的字符串,每列个字符(除了最后一列可能不足个)。
输入样例
4
This is a test case输出样例
asa T
st ih
e tsi
ce s作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ’s Solution
- 首先确定输出时会有每行有多少个字符,设字符串长度为,应有字符数为,首先有,如果,应再;
可以这样理解:先假设能整除,结果必为,但如果可能有余数,则会在多出的一行进行表达,则答案;
- 利用字符串的加减法则,模拟即可;
PotremZ の C++ 解決策
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n; scanf("%d\n",&n);
string s,ans[105]=""; getline(cin,s);
int len=s.size(),m=len/n+(len%n ? 1 : 0);
for(int j=0,i=0;j<len;i=(i+1)%n,++j)
ans[i]=s[j]+ans[i];
for(int i=0;i<n;++i){
if(ans[i].size()<m)
for(int j=1;j<=m-ans[i].size();++j) cout<<" ";
cout<<ans[i]<<endl;
}
return 0;
}winterl の Python 解決策
from math import ceil # 向上取整
# 初始化表格的高度,并根据消息长度计算宽度
height = int(input())
message = input()
length = len(message)
width = int(ceil(length / height))
# 初始化表格中全是空格
grid = [[" " for _ in range(width)] for _ in range(height)]
index = 0 # 用于遍历字符串
# 给表格填内容
for x in range(width)[::-1]:
for y in range(height):
grid[y][x] = message[index]
index += 1
if index < length:
continue
# 字符串遍历完了就是填完了,直接打印就行
for line in grid:
print("".join(line))
# 一定要记得退出程序!!!
exit(0)L1-040 最佳情侣身高差 (10 分)
专家通过多组情侣研究数据发现,最佳的情侣身高差遵循着一个公式:(女方的身高)(男方的身高)。如果符合,你俩的身高差不管是牵手、拥抱、接吻,都是最和谐的差度。
下面就请你写个程序,为任意一位用户计算他/她的情侣的最佳身高。
输入格式
输入第一行给出正整数,为前来查询的用户数。随后行,每行按照“性别 身高”的格式给出前来查询的用户的性别和身高,其中“性别”为“F”表示女性、“M”表示男性;“身高”为区间 之间的实数。
输出格式
对每一个查询,在一行中为该用户计算出其情侣的最佳身高,保留小数点后位。
输入样例
2
M 1.75
F 1.8输出样例
1.61
1.96作者:陈越
单位:浙江大学
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
PotremZ の C++ 解決策
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n; scanf("%d",&n);
while(n--){
char S; double h;
cin>>S>>h;
if(S=='M') printf("%.2lf\n",h/1.09);
else printf("%.2lf\n",h*1.09);
}
return 0;
}winterl の Python 解決策
for _ in range(int(input())):
sex, height = input().split()
# 计算身高差
answer = float(height) * (1.09 if sex == "F" else 1 / 1.09)
# 格式化字符串 保留两位小数
print(f"{answer:.2f}")