Python真题练习:1004-成绩排名、1009-说反话、1017-A除以B、1018-锤子剪刀布
1004——成绩排名
读入n (>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
…………
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
输出样例:
Mike CS991301
Joe Math990112
代码实现:
def GradeRanking(n):
name=[]
num=[]
grade=[]
for i in range(int(n)):
a=input().split()
name.append(a[0])
num.append(a[1])
grade.append(int(a[2]))
gmax=grade[0]
gmin=grade[0]
g1,g2=0,0
for i in range(len(grade)):
if grade[i]>gmax:
gmax=grade[i]
g1=i
if grade[i]<gmin:
gmin=grade[i]
g2=i
print(name[g1],num[g1])
print(name[g2],num[g2])
n=input()
GradeRanking(n)
运行结果:
1009——说反话
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:
Hello World Here I Come
输出样例:
Come I Here World Hello
代码实现:
#第一种方法
s=input().split()
s1=s[::-1]
s2=' '.join(s1)
print(s2)
#第二种方法
s=input().split()
s.reverse()
s1=' '.join(s)
print(s1)
运行结果:
1017——A除以B
本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得 A=BxQ+R 成立。
输入格式:
输入在一行中依次给出A和B,中间以1空格分隔。
输出格式:
在一行中依次输出Q和R,中间以1空格分隔。
输入样例:
123456789050987654321 7
输出样例:
17636684150141093474 3
代码实现:
def AdiviB(s):
R=int(s[0])%int(s[1])
Q=(int(s[0])-R)//int(s[1])
print(Q,R)
s=input().split()
if len(s)==2:
AdiviB(s)
运行结果:
1018——锤子剪刀布
大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图所示:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。
输入格式:
输入第1行给出正整数N (<=10^5),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。
输出格式:
输出第 1、2 行分别给出甲、乙的胜、平、负次数,数字间以 1 个空格分隔。第 3 行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有 1 个空格。如果解不唯一,则输出按字母序最小的解。
输入样例:
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J
输出样例:
5 3 2
2 3 5
B B
代码实现:
def CJB(n):
J1=0#甲赢的第一种情况,即甲C乙J
J2=0#甲赢的第二种情况,即甲J乙B
J3=0#甲赢的第三种情况,即甲B乙C
Ping=0#平局计数
Y1=0#乙赢的第二种情况,即甲J乙C
Y2=0#乙赢的第三种情况,即甲B乙J
Y3=0#乙赢的第一种情况,即甲C乙B
for k in range(int(n)):#输赢判断、计数
i=input().split()
if i[0]=='C' and i[1]=='J':
J1+=1
elif i[0]=='J' and i[1]=='B':
J2+=1
elif i[0]=='B' and i[1]=='C':
J3+=1
elif i[0]=='J' and i[1]=='C':
Y1+=1
elif i[0]=='B' and i[1]=='J':
Y2+=1
elif i[0]=='C' and i[1]=='B':
Y3+=1
else:
Ping+=1
#甲、乙赢、平、输次数
print(J1+J2+J3,Ping,int(n)-(J1+J2+J3+Ping))
print(Y1+Y2+Y3,Ping,int(n)-(Y1+Y2+Y3+Ping))
#甲、乙获胜次数最多的手势
if J1>=J2 and J1>J3:
a='C'
elif J2>J1 and J2>J3:
a='J'
elif J3>=J1 and J3>=J2:
a='B'
if Y1>=Y2 and Y1>Y3:
b='C'
elif Y2>Y1 and Y2>Y3:
b='J'
elif Y3>=Y1 and Y3>=Y2:
b='B'
print(a,b)
n=input()
CJB(n)
运行结果: