以下に、Pythonプログラムを解説します。
# じゃんけんの手の出し方
n, m = map(int, input().split()) # じゃんけんの回数 n と出す指の本数の合計 m を入力
s = input() # 相手のじゃんけんの手を表す文字列 s を入力
# じゃんけんの手のカウントを初期化
enemy_g, enemy_c, enemy_p = 0, 0, 0
for v in s:
if v == "G":
enemy_g += 1 # 相手がグーを出す回数をカウント
elif v == "C":
enemy_c += 1 # 相手がチョキを出す回数をカウント
else:
enemy_p += 1 # 相手がパーを出す回数をカウント
ans = 0 # 勝つ回数の最大値を格納する変数
# 0 ≦ p ≦ m//5 の範囲で p(パーの回数)を全探索
for p in range(m // 5 + 1):
c = (m - p * 5) // 2 # 指の本数の合計から p 回のパーを引いた後、残りをチョキの回数 c として計算
g = n - p - c # 残りのじゃんけんの回数をグーの回数 g とする
if g < 0:
continue # グーの回数が負の値になった場合は無視
if p * 5 + c * 2 != m:
continue # 出した指の本数が m に満たない場合は無視
# 勝てる回数を計算して最大値を更新
ans = max(ans, min(p, enemy_g) + min(c, enemy_p) + min(g, enemy_c))
print(ans) # 最大勝利回数を出力
解説
-
入力値の取得
n, m = map(int, input().split()) s = input()
- じゃんけんの回数
n
と出す指の本数の合計m
を入力から取得します。 - 相手のじゃんけんの手を表す文字列
s
を入力から取得します。
- じゃんけんの回数
-
相手の手のカウント
enemy_g, enemy_c, enemy_p = 0, 0, 0 for v in s: if v == "G": enemy_g += 1 elif v == "C": enemy_c += 1 else: enemy_p += 1
- 相手の手の出し方をカウントします。
enemy_g
はグーの回数、enemy_c
はチョキの回数、enemy_p
はパーの回数です。
- 相手の手の出し方をカウントします。
-
勝つ回数の最大値の計算
ans = 0 for p in range(m // 5 + 1): c = (m - p * 5) // 2 g = n - p - c if g < 0: continue if p * 5 + c * 2 != m: continue ans = max(ans, min(p, enemy_g) + min(c, enemy_p) + min(g, enemy_c))
- パーの回数
p
を全探索し、各p
に対してチョキの回数c
とグーの回数g
を計算します。 - グーの回数が負の値になる場合や、出した指の本数が
m
に満たない場合は無視します。 - 勝てる回数を計算し、最大値を更新します。
- パーの回数
-
結果の出力
print(ans)
- 勝つ回数の最大値を出力します。
このプログラムは、相手の手に対して最適な手を選び、出す指の本数の合計が m
になるようにじゃんけんを行うことで、最大勝利回数を求めます。