結果
問題 |
No.3120 Lower Nim
|
ユーザー |
|
提出日時 | 2025-06-02 09:57:34 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,678 bytes |
コンパイル時間 | 445 ms |
コンパイル使用メモリ | 82,300 KB |
実行使用メモリ | 94,112 KB |
平均クエリ数 | 1360.27 |
最終ジャッジ日時 | 2025-06-02 09:57:47 |
合計ジャッジ時間 | 11,440 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 23 WA * 20 |
ソースコード
import sys def solve(): """ インタラクティブなゲーム問題を解くためのメイン関数です。 """ # 標準入力の高速化 input = sys.stdin.readline # Nの読み込み try: n_str = input() if not n_str: return n = int(n_str) # Aの読み込み a = list(map(int, input().split())) except (IOError, ValueError): return # ニム和を計算する関数 def calculate_nim_sum(arr): nim_sum = 0 for x in arr: nim_sum ^= x return nim_sum # 初期のニム和を計算 initial_nim_sum = calculate_nim_sum(a) # 先攻・後攻の決定 if initial_nim_sum == 0: player = "Second" print("Second", flush=True) else: player = "First" print("First", flush=True) # ゲームループ turn = "First" while True: if turn == player: # 自分のターン current_nim_sum = calculate_nim_sum(a) # 最適な手を見つける move_i, move_x = -1, -1 for i in range(n): if (a[i] ^ current_nim_sum) < a[i]: move_x = a[i] - (a[i] ^ current_nim_sum) move_i = i break # 手を出力 print(f"{move_i + 1} {move_x}", flush=True) a[move_i] -= move_x # ジャッジからの応答を読み込む try: ret_str = input() if not ret_str: return ret = int(ret_str) except (IOError, ValueError): return if ret != 0: # ゲーム終了 return else: # 相手のターン try: line = input() if not line: return i, x = map(int, line.split()) except (IOError, ValueError): return # 相手の手を盤面に反映 if i != -1: # 初期状態でないことを確認 a[i - 1] -= x # ジャッジからの応答を読み込む try: ret_str = input() if not ret_str: return ret = int(ret_str) except (IOError, ValueError): return if ret != 0: # ゲーム終了 return # ターンを交代 turn = "Second" if turn == "First" else "First" if __name__ == "__main__": solve()