結果

問題 No.174 カードゲーム(Hard)
ユーザー Mao-betaMao-beta
提出日時 2024-03-23 20:33:44
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,134 bytes
コンパイル時間 316 ms
コンパイル使用メモリ 81,700 KB
実行使用メモリ 100,852 KB
最終ジャッジ日時 2024-03-23 20:33:54
合計ジャッジ時間 9,517 ms
ジャッジサーバーID
(参考情報)
judge15 / judge11
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 47 ms
57,696 KB
testcase_01 WA -
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 AC 44 ms
57,696 KB
testcase_11 AC 45 ms
57,696 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
import math
import bisect
from heapq import heapify, heappop, heappush
from collections import deque, defaultdict, Counter
from functools import lru_cache
from itertools import accumulate, combinations, permutations, product

sys.setrecursionlimit(1000000)
MOD = 10 ** 9 + 7
MOD99 = 998244353

input = lambda: sys.stdin.readline().strip()
NI = lambda: int(input())
NMI = lambda: map(int, input().split())
NLI = lambda: list(NMI())
SI = lambda: input()
SMI = lambda: input().split()
SLI = lambda: list(SMI())
EI = lambda m: [NLI() for _ in range(m)]


def main():
    N, Pa, Pb = SMI()
    N = int(N)
    Pa = float(Pa)
    Pb = float(Pb)
    A = NLI()
    B = NLI()
    A.sort()
    B.sort()

    def f(p):
        # dp[i][j]: Xiがjターン目に出される確率
        dp = [[0]*N for _ in range(N)]
        # P[case]: caseに到達する確率
        P = [0] * (1<<N)
        P[0] = 1

        for case in range(1<<N):
            turn = case.bit_count()
            first = True
            # print("#", bin(case))
            for i in range(N):
                if (case >> i) & 1:
                    continue
                if turn == N-1:
                    dp[i][turn] += P[case]
                    P[case|(1<<i)] += P[case]
                elif first:
                    # print(i, p, p)
                    dp[i][turn] += P[case] * p
                    P[case|(1<<i)] += P[case] * p
                    first = False
                else:
                    # print(i, (1-p) / (N-1-turn), (1-p))
                    dp[i][turn] += P[case] * (1-p) / (N-1-turn)
                    P[case|(1<<i)] = P[case] * (1-p) / (N-1-turn)

        return dp

    dpa = f(Pa)
    dpb = f(Pb)

    ans = 0
    for turn in range(N):
        s = 0
        for ai in range(N):
            for bi in range(N):
                s += dpa[ai][turn] * dpb[bi][turn]
                if A[ai] > B[bi]:
                    # print(A[ai], B[bi], turn, dpa[ai][turn], dpb[bi][turn])
                    ans += (A[ai]+B[bi]) * dpa[ai][turn] * dpb[bi][turn]

        # print(s)
    print(ans)


if __name__ == "__main__":
    main()
0