| 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()