以下に、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 になるようにじゃんけんを行うことで、最大勝利回数を求めます。