結果
問題 |
No.102 トランプを奪え
|
ユーザー |
![]() |
提出日時 | 2025-06-12 13:53:27 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,823 bytes |
コンパイル時間 | 198 ms |
コンパイル使用メモリ | 82,688 KB |
実行使用メモリ | 134,784 KB |
最終ジャッジ日時 | 2025-06-12 13:54:43 |
合計ジャッジ時間 | 11,711 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 6 TLE * 1 -- * 1 |
ソースコード
import sys from functools import lru_cache def main(): sys.setrecursionlimit(1 << 25) n = list(map(int, sys.stdin.readline().split())) n1, n2, n3, n4 = n @lru_cache(maxsize=None) def dfs(n1, n2, n3, n4, taro, jiro, turn): if n1 + n2 + n3 + n4 == 0: return taro - jiro best = -float('inf') if turn == 0 else float('inf') stacks = [(n1, 0), (n2, 1), (n3, 2), (n4, 3)] for current_n, i in stacks: if current_n == 0: continue max_take = min(3, current_n) for take in range(1, max_take + 1): new_n = [n1, n2, n3, n4] new_n[i] -= take new_n1, new_n2, new_n3, new_n4 = new_n new_taro = taro new_jiro = jiro if turn == 0: new_taro += take else: new_jiro += take if new_n[i] == 0: if turn == 0: stolen = (new_jiro + 1) // 2 new_taro += stolen new_jiro -= stolen else: stolen = (new_taro + 1) // 2 new_jiro += stolen new_taro -= stolen if turn == 0: res = dfs(new_n1, new_n2, new_n3, new_n4, new_taro, new_jiro, 1) best = max(best, res) else: res = dfs(new_n1, new_n2, new_n3, new_n4, new_taro, new_jiro, 0) best = min(best, res) return best result = dfs(n1, n2, n3, n4, 0, 0, 0) if result > 0: print("Taro") elif result < 0: print("Jiro") else: print("Draw") if __name__ == "__main__": main()