結果
| 問題 |
No.173 カードゲーム(Medium)
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 2025-06-12 14:40:36 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,803 bytes |
| コンパイル時間 | 388 ms |
| コンパイル使用メモリ | 82,368 KB |
| 実行使用メモリ | 759,144 KB |
| 最終ジャッジ日時 | 2025-06-12 14:40:41 |
| 合計ジャッジ時間 | 5,066 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 2 MLE * 1 -- * 7 |
ソースコード
import sys
from functools import lru_cache
def main():
input = sys.stdin.read().split()
ptr = 0
N = int(input[ptr])
ptr += 1
P_A = float(input[ptr])
ptr += 1
P_B = float(input[ptr])
ptr += 1
A = list(map(int, input[ptr:ptr+N]))
ptr += N
B = list(map(int, input[ptr:ptr+N]))
ptr += N
# Precompute the index for each card for A and B
a_index = {card: idx for idx, card in enumerate(A)}
b_index = {card: idx for idx, card in enumerate(B)}
# Precompute the probability for each subset for A and B
a_subsets = {}
for mask in range(1 << N):
cards = [A[i] for i in range(N) if (mask & (1 << i))]
if not cards:
continue
a_subsets[mask] = compute_probabilities(cards, P_A, a_index)
b_subsets = {}
for mask in range(1 << N):
cards = [B[i] for i in range(N) if (mask & (1 << i))]
if not cards:
continue
b_subsets[mask] = compute_probabilities(cards, P_B, b_index)
@lru_cache(maxsize=None)
def dfs(a_mask, b_mask, d):
if a_mask == 0 and b_mask == 0:
return 1.0 if d > 0 else 0.0
total = 0.0
a_cards = [A[i] for i in range(N) if (a_mask & (1 << i))]
a_probs = a_subsets.get(a_mask, {})
b_cards = [B[i] for i in range(N) if (b_mask & (1 << i))]
b_probs = b_subsets.get(b_mask, {})
for a_card, p_a in a_probs.items():
a_idx = a_index[a_card]
new_a_mask = a_mask ^ (1 << a_idx)
for b_card, p_b in b_probs.items():
b_idx = b_index[b_card]
new_b_mask = b_mask ^ (1 << b_idx)
if a_card > b_card:
new_d = d + (a_card + b_card)
elif b_card > a_card:
new_d = d - (a_card + b_card)
else:
new_d = d
prob = p_a * p_b * dfs(new_a_mask, new_b_mask, new_d)
total += prob
return total
initial_a_mask = (1 << N) - 1
initial_b_mask = (1 << N) - 1
result = dfs(initial_a_mask, initial_b_mask, 0)
print("{0:.15f}".format(result).rstrip('0').rstrip('.') if '.' in "{0:.15f}".format(result) else "{0:.15f}".format(result))
def compute_probabilities(cards, P, index):
if len(cards) == 1:
return {cards[0]: 1.0}
else:
min_card = min(cards)
prob_min = P
others = [c for c in cards if c != min_card]
other_prob = (1 - P) / len(others) if others else 0.0
prob = {}
prob[min_card] = prob_min
for c in others:
prob[c] = other_prob
return prob
if __name__ == "__main__":
main()
gew1fw