結果
| 問題 |
No.174 カードゲーム(Hard)
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-04-15 23:54:26 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,502 bytes |
| コンパイル時間 | 213 ms |
| コンパイル使用メモリ | 82,068 KB |
| 実行使用メモリ | 56,696 KB |
| 最終ジャッジ日時 | 2025-04-15 23:55:23 |
| 合計ジャッジ時間 | 3,909 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 2 TLE * 1 -- * 9 |
ソースコード
import sys
from functools import lru_cache
def main():
sys.setrecursionlimit(1 << 25)
N, PA, PB = sys.stdin.readline().split()
N = int(N)
PA = float(PA)
PB = float(PB)
A = list(map(int, sys.stdin.readline().split()))
B = list(map(int, sys.stdin.readline().split()))
A_sorted = sorted(A)
B_sorted = sorted(B)
a_index = {a: i for i, a in enumerate(A_sorted)}
b_index = {b: i for i, b in enumerate(B_sorted)}
initial_a_mask = (1 << N) - 1
initial_b_mask = (1 << N) - 1
@lru_cache(maxsize=None)
def get_min_and_count(mask, is_a):
if mask == 0:
return (None, 0)
sorted_list = A_sorted if is_a else B_sorted
count = bin(mask).count('1')
for i in range(N):
if mask & (1 << i):
return (sorted_list[i], count)
return (None, 0)
@lru_cache(maxsize=None)
def dp(a_mask, b_mask):
a_min, a_count = get_min_and_count(a_mask, True)
b_min, b_count = get_min_and_count(b_mask, False)
if a_count == 0 or b_count == 0:
return 0.0
total = 0.0
a_probs = {}
if a_count == 1:
a_probs[a_min] = 1.0
else:
a_probs[a_min] = PA
other_prob = (1.0 - PA) / (a_count - 1)
for i in range(N):
a = A_sorted[i]
if (a_mask & (1 << i)) and a != a_min:
a_probs[a] = a_probs.get(a, 0.0) + other_prob
b_probs = {}
if b_count == 1:
b_probs[b_min] = 1.0
else:
b_probs[b_min] = PB
other_prob = (1.0 - PB) / (b_count - 1)
for i in range(N):
b = B_sorted[i]
if (b_mask & (1 << i)) and b != b_min:
b_probs[b] = b_probs.get(b, 0.0) + other_prob
for a in a_probs:
a_prob = a_probs[a]
a_bit = 1 << a_index[a]
new_a_mask = a_mask ^ a_bit
for b in b_probs:
b_prob = b_probs[b]
b_bit = 1 << b_index[b]
new_b_mask = b_mask ^ b_bit
prob = a_prob * b_prob
current = (a + b) if (a > b) else 0
total += prob * (current + dp(new_a_mask, new_b_mask))
return total
result = dp(initial_a_mask, initial_b_mask)
print("{0:.15f}".format(result))
if __name__ == "__main__":
main()
lam6er