結果
| 問題 |
No.102 トランプを奪え
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 18:50:18 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 3,583 ms / 5,000 ms |
| コード長 | 3,701 bytes |
| コンパイル時間 | 393 ms |
| コンパイル使用メモリ | 82,448 KB |
| 実行使用メモリ | 276,048 KB |
| 最終ジャッジ日時 | 2025-06-12 18:50:35 |
| 合計ジャッジ時間 | 10,035 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 8 |
ソースコード
import sys
from functools import lru_cache
def main():
sys.setrecursionlimit(1 << 25)
N = list(map(int, sys.stdin.readline().split()))
N = tuple(N)
@lru_cache(maxsize=None)
def dfs(piles, taro, jiro, is_taro_turn):
piles = list(piles)
# Check if all piles are empty
if sum(piles) == 0:
if taro > jiro:
return 1 # Taro wins
elif taro < jiro:
return -1 # Jiro wins
else:
return 0 # Draw
best = None
for i in range(4):
if piles[i] == 0:
continue
for take in [1, 2, 3]:
if take > piles[i]:
continue
new_piles = piles.copy()
new_piles[i] -= take
new_piles_tuple = tuple(new_piles)
if is_taro_turn:
new_taro = taro + take
new_jiro = jiro
if new_piles[i] == 0:
stolen = (new_jiro) // 2 + (new_jiro % 2)
new_taro += stolen
new_jiro -= stolen
if new_jiro < 0:
new_jiro = 0
outcome = dfs(new_piles_tuple, new_taro, new_jiro, False)
if outcome == 1:
return 1
else:
new_taro = taro
new_jiro = jiro + take
if new_piles[i] == 0:
stolen = (new_taro) // 2 + (new_taro % 2)
new_jiro += stolen
new_taro -= stolen
if new_taro < 0:
new_taro = 0
outcome = dfs(new_piles_tuple, new_taro, new_jiro, True)
if outcome == -1:
return -1
# After checking all possible moves
results = []
for i in range(4):
if piles[i] == 0:
continue
for take in [1, 2, 3]:
if take > piles[i]:
continue
new_piles = piles.copy()
new_piles[i] -= take
new_piles_tuple = tuple(new_piles)
if is_taro_turn:
new_taro = taro + take
new_jiro = jiro
if new_piles[i] == 0:
stolen = (new_jiro) // 2 + (new_jiro % 2)
new_taro += stolen
new_jiro -= stolen
if new_jiro < 0:
new_jiro = 0
else:
new_taro = taro
new_jiro = jiro + take
if new_piles[i] == 0:
stolen = (new_taro) // 2 + (new_taro % 2)
new_jiro += stolen
new_taro -= stolen
if new_taro < 0:
new_taro = 0
outcome = dfs(new_piles_tuple, new_taro, new_jiro, not is_taro_turn)
results.append(outcome)
if is_taro_turn:
if 1 in results:
return 1
if 0 in results:
return 0
return -1
else:
if -1 in results:
return -1
if 0 in results:
return 0
return 1
result = dfs(N, 0, 0, True)
if result == 1:
print("Taro")
elif result == -1:
print("Jiro")
else:
print("Draw")
if __name__ == "__main__":
main()
gew1fw