목차

복권 + 은행

ps
링크acmicpc.net/…
출처BOJ
문제 번호13258
문제명복권 + 은행
레벨골드 5
분류

기댓값

시간복잡도O(n)
인풋사이즈n<=1000
사용한 언어Python 3.11
제출기록31256KB / 40ms
최고기록36ms
해결날짜2023/07/15

풀이

코드

코드 1 - O(n^2) DP

"""Solution code for "BOJ 13258. 복권 + 은행".

- Problem link: https://www.acmicpc.net/problem/13258
- Solution link: http://www.teferi.net/ps/problems/boj/13258

Tags: [dp]
"""


def main():
    N = int(input())  # pylint: disable=unused-variable
    balances = [int(x) for x in input().split()]
    J = int(input())
    C = int(input())

    init_balance = balances[0]
    tot_balance = sum(balances)
    dp_cur = [1.0, 0.0]  # dp_cur[x] = probability of winning x times so far
    for j in range(1, C + 1):
        dp_prev, dp_cur = dp_cur, [0.0] * (j + 2)
        dp_cur[0] = dp_prev[0] * (1 - (init_balance / tot_balance))
        for i in range(1, j + 1):
            dp_cur[i] = (
                dp_prev[i - 1] * (init_balance + (i - 1) * J)
                + dp_prev[i] * (tot_balance - (init_balance + i * J))
            ) / tot_balance
        tot_balance += J

    answer = init_balance + J * sum(x * prob for x, prob in enumerate(dp_cur))
    print(answer)


if __name__ == '__main__':
    main()

코드 2 - O(n)

"""Solution code for "BOJ 13258. 복권 + 은행".

- Problem link: https://www.acmicpc.net/problem/13258
- Solution link: http://www.teferi.net/ps/problems/boj/13258

Tags: [math]
"""


def main():
    N = int(input())  # pylint: disable=unused-variable
    balances = [int(x) for x in input().split()]
    J = int(input())
    C = int(input())

    expected_my_balance = balances[0]
    tot_balance = sum(balances)
    for _ in range(C):
        expected_my_balance += (expected_my_balance / tot_balance) * J
        tot_balance += J

    print(expected_my_balance)


if __name__ == '__main__':
    main()