用python做下题 提目:抓糖豆,小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w个超甜糖豆和b个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。 输入描述:输入两个整数w,b。(0<=w,b<=1000) 输出描述:答案保留9位小数。
时间: 2024-04-15 13:29:00 浏览: 109
可以使用动态规划来解决这个问题。假设dp[i][j]表示在有i个超甜糖豆和j个普通糖豆的情况下,小Q获胜的概率。
根据题目要求,小Q先吃,所以如果超甜糖豆的数量大于等于1,小Q直接获胜,概率为1。如果超甜糖豆的数量为0,那么小Q必输,概率为0。
对于其他情况,小Q的获胜概率可以通过以下方式计算:
1. 小Q吃一个超甜糖豆,变成有i-1个超甜糖豆和j个普通糖豆的情况。此时小K先吃,小Q的获胜概率为dp[i-1][j]。
2. 小Q吃一个普通糖豆,变成有i个超甜糖豆和j-1个普通糖豆的情况。此时小K先吃,小Q的获胜概率为dp[i][j-1]。
综上所述,dp[i][j] = (i / (i + j)) + (j / (i + j)) * (j-1) / (i + j - 1) * dp[i][j-2]。
具体代码实现如下:
```python
def calculate_probability(w, b):
dp = [[0] * (b + 1) for _ in range(w + 1)]
total = w + b
for i in range(1, w + 1):
dp[i][0] = 1.0
for i in range(1, w + 1):
for j in range(1, b + 1):
dp[i][j] = i / total + (j / total) * (j - 1) / (total - 1) * dp[i][j - 2]
return dp[w][b]
w, b = map(int, input().split())
result = calculate_probability(w, b)
print("{:.9f}".format(result))
```
注意,这里使用了动态规划的思想,计算概率时需要考虑边界情况,例如当w或b为0时,直接返回0或1。
希望能帮到你!
阅读全文