1018 錘子剪刀布

2021-09-19 03:31:40 字數 3370 閱讀 4285

題意描述:

現給出兩人的交鋒記錄,請統計雙方的勝、平、負次數,並且給出雙方分別出什麼手勢的勝算最大。

輸入格式:

輸入第 1 行給出正整數 n(≤10^​5​​ ),即雙方交鋒的次數。隨後 n 行,每行給出一次交鋒的資訊,即甲、乙雙方同時給出的的手勢。c 代表「錘子」、j 代表「剪刀」、b 代表「布」,第 1 個字母代表甲方,第 2 個代表乙方,中間有 1 個空格。

輸出格式:

輸出第 1、2 行分別給出甲、乙的勝、平、負次數,數字間以 1 個空格分隔。第 3 行給出兩個字母,分別代表甲、乙獲勝次數最多的手勢,中間有 1 個空格。如果解不唯一,則輸出按字母序最小的解。

輸入樣例:

10

c jj b

c bb b

b cc c

c bj b

b cj j

輸出樣例:

5 3 2

2 3 5

b b

解題思路:觀察題目中給出的測試樣例的輸出可以發現,第一行的輸出和第二行的輸出有著相反的順序。其實是兩人參與遊戲時,乙個人輸,一定是另乙個人贏了;乙個人是平局,另乙個人也是平局。這樣,我們就能簡化這個問題為求解甲的勝平負的次數勝利局最常用的手勢,和失敗局中對手最常用的手勢即可。

**:

def

main()

: n =

int(

input()

)# 接收輸入的局數

wins =

0 lose =

0 flat =

0# 記錄甲的 勝平負 局數

win_position =[0

,0,0

]# 統計甲的勝利局中 石頭 剪刀 布三種手勢使用的次數,這裡的順序對應下面的temp列表。

#即win_position[0]記錄出 布 的次數,win_position[1]記錄出 鎚頭 的次數 ,win_position[2]記錄出 剪刀 的次數

defeat_by =[0

,0,0

]# 統計甲的失敗局中對手 石頭 剪刀 布三種手勢使用的次數,這裡的順序對應下面的temp列表。

temp =

['b'

,'c'

,'j'

]# 注意這裡bcj的順序,之所以這樣排列是因為輸出格式中有要求: 如果解不唯一,則輸出按字母序最小的解。

#就是說如果甲用 b 和 c 各贏了5次,我們應該輸出 b,因為 b 是字母序最小的

# 後面的**中用到了list的index方法來找到使用手勢次數最多的下標,從而找到對應的手勢。

# 而在list中有多個我們需要找的值的時候,index返回下標最小的那乙個。 所以需要這樣排列來滿足下面**的需求。

for x in

range

(n):

data =

input()

.split(

)# 接收每局 甲乙雙方的手勢

if data[0]

=='c'

:# 分類討論即可,因為規則只有三條,直接寫出來簡單易懂而且效率也能滿足要求。

if data[1]

=='j'

: wins +=

1 win_position[1]

+=1# win_position[1] 對應 c

elif data[1]

=='b'

: lose +=

1 defeat_by[0]

+=1# defeat_by[0] 對應 b

else

: flat +=

1elif data[0]

=='j'

:if data[1]

=='b'

: wins +=

1 win_position[2]

+=1elif data[1]

=='c'

: lose +=

1 defeat_by[1]

+=1else

: flat +=

1elif data[0]

=='b'

:if data[1]

=='c'

: wins +=

1 win_position[0]

+=1elif data[1]

=='j'

: lose +=

1 defeat_by[2]

+=1else

: flat +=

1print

("{} {} {}"

.format

(wins, flat, lose)

)print

("{} {} {}"

.format

(lose, flat, wins)

)# 輸出甲乙兩人對應的勝平負的次數

print

(temp[win_position.index(

max(win_position))]

, temp[defeat_by.index(

max(defeat_by))]

)"""

max(win_position)返回win_position列表中的最大值,win_position.index(max(win_postion))返回最大值對應的下標

(如果有多個返回最小的乙個),temp[win_position.index(max(win_postion))]

得出勝局使用次數最多的手勢(如果有多個,返回字母序最小的乙個)

"""return

if __name__ ==

'__main__'

: main(

)

易錯點:總結:

1018 錘子剪刀布

大家應該都會玩 錘子剪刀布 的遊戲 兩人同時給出手勢,勝負規則如圖所示 現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。輸入格式 輸入第1行給出正整數n 105 即雙方交鋒的次數。隨後n行,每行給出一次交鋒的資訊,即甲 乙雙方同時給出的的手勢。c代表 錘子 j...

1018 錘子剪刀布

輸入格式 輸入第1行給出正整數n 105 即雙方交鋒的次數。隨後n行,每行給出一次交鋒的資訊,即甲 乙雙方同時給出的的手勢。c代表 錘子 j代表 剪刀 b代表 布 第1個字母代表甲方,第2個代表乙方,中間有1個空格。輸出格式 輸出第1 2行分別給出甲 乙的勝 平 負次數,數字間以1個空格分隔。第3行...

1018 錘子剪刀布

現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。輸入格式 輸入第1行給出正整數n 105 即雙方交鋒的次數。隨後n行,每行給出一次交鋒的資訊,即甲 乙雙方同時給出的的手勢。c代表 錘子 j代表 剪刀 b代表 布 第1個字母代表甲方,第2個代表乙方,中間有1個空...