PAT08:锤子剪刀布

8.锤子剪刀布

题目

1
2
大家应该都会玩“锤子剪刀布”的游戏:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入描述:

1
2
输入第1行给出正整数N<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B
表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。

输出描述:

1
输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯一,则输出按字母序最小的解。

输入例子:

1
2
3
4
5
6
7
8
9
10
11
10
C J
J B
C B
B B
B C
C C
C B
J B
B C
J J

输出例子:

1
2
3
5 3 2
2 3 5
B B

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import sys

lst = sys.stdin.readlines()
playNum = lst[0]

win_a = 0
draw_a = 0
lose_a = 0
win_b = 0
draw_b = 0
lose_b = 0
a_c = 0
a_j = 0
a_b = 0
b_c = 0
b_j = 0
b_b = 0

for line in lst[1:]:
line = line.split(' ')
a = line[0]
b = line[1].strip()
if a == b:
draw_a += 1
draw_b += 1
elif a == 'C':
if b == 'B':
lose_a += 1
win_b += 1
b_b += 1
elif b == 'J':
win_a += 1
lose_b += 1
a_c += 1
elif a == 'J':
if b == 'B':
win_a += 1
lose_b += 1
a_j += 1

elif b == 'C':
lose_a += 1
win_b += 1
b_c += 1
elif a == 'B':
if b == 'J':
lose_a += 1
win_b += 1
b_b += 1
elif b == 'C':
win_a += 1
lose_b += 1
a_b += 1

a_all = [a_b, a_j, a_c]
a_paly = ['B', 'J', 'C']
b_all = [b_b, b_j, b_c]
b_paly = ['B', 'J', 'C']

maxNum_a = max(a_all)
maxNum_b = max(b_all)
most_a = None
most_b = None

for index, i in enumerate(a_all):
if i == maxNum_a:
if most_a is None:
most_a = a_paly[index]
elif ord(a_paly[index]) <= ord(most_a):
most_a = a_paly[index]
for index, i in enumerate(b_all):
if i == maxNum_b:
if most_b is None:
most_b = b_paly[index]
if ord(b_paly[index]) <= ord(most_b):
most_b = b_paly[index]
print(win_a, draw_a, lose_a)
print(win_b, draw_b, lose_b)
print(most_a, most_b)

知识点

若最大值相同,按字母顺序选择

直接先按照字母顺序排列,依次判断是否为最大值

1
2
3
4
5
6
7
8
def most_win(b, c, j):
if b == max(b, c, j):
return 'B'
elif c == max(b, c, j):
return 'C'
elif j == max(b, c, j):
return 'J'