第14回アルゴリズム実技検定(PAST)の解説記事です。
目次
PAST第14回 A – シンプル石取りゲーム
問題
問題文の要約は以下の通りです。
問題の要約
Alice と Bob がゲームをします。最初、山には \(N\) 個の石があり、先手から順に交互に山から石を1個ずつ取り除いていきます。
\(S\) が0のとき Alice が先手で、1のとき Bob が先手です。
\(T\) が0のとき最後の石を取り除いた人が勝ちで、1のとき最後の石を取り除いた人が負け(他方が勝ち)です。
どちらが勝つか判定せよ。
解説
最後の手番がどちらになるか考える。
解説
最後の手番がどちらになるか考えます。
\(N+S\) を2で割った余りが0であればBob、1であればAliceが最後の手番になります。
最後の石を取った人が負けの場合は最後の手番ではない方が勝者なので0と1を入れ替えれば勝者が得られます。
解答
# 入力
N,S,T=map(int,input().split())
# 最後の手番 0であればBob,1であればAlice
winner=(N + S) % 2
# 最後の石を取った人が負けの場合
if T == 1:
winner=1-winner
# 0であればBob,1であればAliceを出力
if winner == 0:
print('Bob')
else:
print('Alice')
PAST第14回 B – 小数点第 D 位
問題
問題文の要約は以下の通りです。
問題の要約
小数 \(A, B\) が小数点第 \(D\) 位まで表示した形式で与えられるので、\(A+B\) を誤差なく計算して同様の形式で出力せよ。
解説
整数部分と小数部分は分けて計算する。
解説
小数点以下の桁数と2つの数を入力として受け取り、それらの数を加算した後、指定された形式で結果を出力します。
整数部分と小数部分は分けて扱い、最終的には小数点以下の桁数に合わせて小数部分がを0で埋めて出力します。
解答
# 入力
d = int(input())
A, a = map(int, input().split("."))
B, b = map(int, input().split("."))
# 整数部分の計算
C = A + B + (a + b) // (10 ** d)
# 小数部分の計算
c = (a + b) % (10 ** d)
# 出力
print(str(C) + "." + str(c).zfill(d))