Submission #3011790


Source Code Expand

N, pq = input().split()
N = int(N)
p, q = map(int, pq.split('/'))

P = p / q
PError = (q - p) / q

Ass = []
for i in range(N):
    Ass.append(list(map(int, input().split())))

# numVs[i]: (v, -j): 本戦順位が(i+1)位の人は、本戦でv勝、予選で(j+1)位 
numVs = [(sum(Ass[i]), -i) for i in range(N)]
numVs.sort(reverse=True)

# prob[v][j]: 実際にはv勝した人がj勝と記録される確率
prob = {}
for v in range(numVs[-1][0], numVs[0][0] + 1):
    # dp[i][j]: i試合目まで行ったとき、j勝と記録される確率
    dp = [0] * N
    dp[v] = 1

    # 前半のv試合は、実際には勝利とする
    for i in range(0, v):
        for j in range(N):
            if dp[j] == 0: continue
            # 確率(1-P)で誤記録→勝利が敗北になる
            dp[j - 1] += dp[j] * PError
            # 確率Pで正しく記録
            dp[j] *= P

    # 後半の(N-1-v)試合は、実際には敗北とする
    for i in range(v, N - 1):
        for j in reversed(range(N)):
            if dp[j] == 0: continue
            # 確率(1-P)で誤記録→敗北が勝利になる
            dp[j + 1] += dp[j] * PError
            # 確率Pで正しく記録
            dp[j] *= P

    prob[v] = dp


# dp[i][j]: 本戦順位が(i+1)位の人が、j勝と記録される確率(順位を変えない範囲で)
dp = [[0] * N for i in range(N)]
dp[0] = prob[numVs[0][0]]
for i in range(1, N):
    accP = 0
    if numVs[i][0] == numVs[i - 1][0] or -numVs[i][1] > -numVs[i - 1][1]:
        # 本戦順位が1つ上の人に対して、本戦での勝利数が同じ、
        # または、予選順位が下ならば、記録上同じ勝利数でも順位は変わらない
        for j in reversed(range(N)):
            accP += dp[i - 1][j]
            dp[i][j] = accP * prob[numVs[i][0]][j]
    else:
        # それ以外は、勝利数が少ない場合のみ順位を保てる
        for j in reversed(range(N)):
            dp[i][j] = accP * prob[numVs[i][0]][j]
            accP += dp[i - 1][j]

print(sum(dp[N - 1]))

Submission Info

Submission Time
Task C - 天下一プログラマーコンテスト1999
User ZollingerPython3
Language Python (3.4.3)
Score 600
Code Size 2135 Byte
Status AC
Exec Time 27 ms
Memory 3188 KB

Judge Result

Set Name All
Score / Max Score 600 / 600
Status
AC × 43
Set Name Test Cases
All 00_sample_01, 00_sample_02, 00_sample_03, 00_sample_04, 02_manual_01, 02_manual_02, 02_manual_03, 02_manual_04, 02_manual_05, 02_manual_06, 02_manual_07, 02_manual_08, 02_manual_09, 02_manual_10, 02_manual_11, 02_manual_12, 20_random_00, 20_random_01, 20_random_02, 20_random_03, 20_random_04, 20_random_05, 20_random_06, 20_random_07, 20_random_08, 20_random_09, 20_random_10, 20_random_11, 20_random_12, 20_random_13, 20_random_14, 20_random_15, 20_random_16, 20_random_17, 20_random_18, 20_random_19, 30_manual_13, 30_manual_14, 30_manual_15, 30_manual_16, 30_manual_17, 30_manual_18, 30_manual_19
Case Name Status Exec Time Memory
00_sample_01 AC 17 ms 3188 KB
00_sample_02 AC 17 ms 3188 KB
00_sample_03 AC 17 ms 3188 KB
00_sample_04 AC 17 ms 3188 KB
02_manual_01 AC 17 ms 3188 KB
02_manual_02 AC 17 ms 3188 KB
02_manual_03 AC 17 ms 3188 KB
02_manual_04 AC 17 ms 3188 KB
02_manual_05 AC 17 ms 3188 KB
02_manual_06 AC 17 ms 3188 KB
02_manual_07 AC 17 ms 3188 KB
02_manual_08 AC 17 ms 3188 KB
02_manual_09 AC 18 ms 3188 KB
02_manual_10 AC 17 ms 3188 KB
02_manual_11 AC 18 ms 3188 KB
02_manual_12 AC 17 ms 3188 KB
20_random_00 AC 20 ms 3188 KB
20_random_01 AC 19 ms 3188 KB
20_random_02 AC 18 ms 3064 KB
20_random_03 AC 18 ms 3188 KB
20_random_04 AC 18 ms 3188 KB
20_random_05 AC 18 ms 3188 KB
20_random_06 AC 18 ms 3188 KB
20_random_07 AC 18 ms 3188 KB
20_random_08 AC 18 ms 3188 KB
20_random_09 AC 18 ms 3188 KB
20_random_10 AC 18 ms 3188 KB
20_random_11 AC 18 ms 3188 KB
20_random_12 AC 18 ms 3188 KB
20_random_13 AC 18 ms 3188 KB
20_random_14 AC 17 ms 3188 KB
20_random_15 AC 18 ms 3188 KB
20_random_16 AC 18 ms 3188 KB
20_random_17 AC 18 ms 3188 KB
20_random_18 AC 18 ms 3188 KB
20_random_19 AC 18 ms 3188 KB
30_manual_13 AC 25 ms 3188 KB
30_manual_14 AC 26 ms 3188 KB
30_manual_15 AC 19 ms 3188 KB
30_manual_16 AC 27 ms 3188 KB
30_manual_17 AC 18 ms 3188 KB
30_manual_18 AC 22 ms 3188 KB
30_manual_19 AC 21 ms 3188 KB