結果

問題 No.309 シャイな人たち (1)
ユーザー gew1fw
提出日時 2025-06-12 20:09:10
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 2,394 bytes
コンパイル時間 304 ms
コンパイル使用メモリ 82,560 KB
実行使用メモリ 77,184 KB
最終ジャッジ日時 2025-06-12 20:14:46
合計ジャッジ時間 2,038 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 4 WA * 9
権限があれば一括ダウンロードができます

ソースコード

diff #

def main():
    import sys
    input = sys.stdin.read().split()
    idx = 0

    R = int(input[idx]); idx +=1
    C = int(input[idx]); idx +=1

    P = []
    for _ in range(R):
        row = list(map(int, input[idx:idx+C]))
        idx += C
        P.append(row)
    
    S = []
    for _ in range(R):
        row = list(map(int, input[idx:idx+C]))
        idx += C
        S.append(row)

    E = [[0.0 for _ in range(C)] for __ in range(R)]
    max_iter = 1000
    threshold = 1e-9

    for _ in range(max_iter):
        new_E = [[0.0 for _ in range(C)] for __ in range(R)]
        max_change = 0.0
        for i in range(R):
            for j in range(C):
                has_front = i > 0
                has_left = j > 0
                has_right = j < C-1

                front_e = E[i-1][j] if has_front else None
                left_e = E[i][j-1] if has_left else None
                right_e = E[i][j+1] if has_right else None

                p = P[i][j] / 100.0
                know = S[i][j]
                a = 4 - know
                if a >=4:
                    q = 1.0
                else:
                    t = 4 - a
                    neighbors = []
                    if has_front: neighbors.append(front_e)
                    if has_left: neighbors.append(left_e)
                    if has_right: neighbors.append(right_e)
                    k = len(neighbors)
                    q = 0.0
                    for mask in range(0, 1 << k):
                        sum_x = 0
                        prob = 1.0
                        for bit in range(k):
                            val = (mask >> bit) & 1
                            e = neighbors[bit]
                            if val == 1:
                                sum_x +=1
                                prob *= e
                            else:
                                prob *= (1 - e)
                        if sum_x >= t:
                            q += prob
                new_E[i][j] = p * (1.0 if a >=4 else q)
                delta = abs(new_E[i][j] - E[i][j])
                if delta > max_change:
                    max_change = delta
        if max_change < threshold:
            break
        E = new_E

    total = 0.0
    for i in range(R):
        for j in range(C):
            total += E[i][j]
    print("{0:.10f}".format(total))

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