ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 13258 |
문제명 | 복권 + 은행 |
레벨 | 골드 5 |
분류 |
기댓값 |
시간복잡도 | O(n) |
인풋사이즈 | n<=1000 |
사용한 언어 | Python 3.11 |
제출기록 | 31256KB / 40ms |
최고기록 | 36ms |
해결날짜 | 2023/07/15 |
"""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()
"""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()