抓糖豆,小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w个超甜糖豆和b个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。输入两个整数w,b。(0<=w,b<=1000).答案保留9位小数。用C语言编写程序实现
时间: 2023-05-26 22:02:00 浏览: 56
#include<stdio.h>
double min(double a, double b){
return a<b?a:b;
}
int main(){
double w,b;
scanf("%lf%lf",&w,&b);
if(w==0){//如果没有超甜糖豆,小K直接获胜
printf("0.000000000");
return 0;
}
double p=w/(w+b);//超甜糖豆的概率
double ans=0;
for(int i=0;i<w;i++){//枚举小Q吃超甜糖豆的个数
double cur=i*p+(w-i)*(b-i-1)/(w+b-i-1)*p;//计算概率
ans+=cur;
}
printf("%.9lf",ans);
return 0;
}
相关问题
抓糖豆,小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w个超甜糖豆和b个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。使用c/c++输出代码
这是一个经典的概率问题,可以使用组合数学的方法求解。
设小Q吃了k颗糖豆(k≥0),其中有x颗超甜糖豆,则小K吃了k-1颗糖豆,其中有y颗超甜糖豆(0≤y<x)。则小Q获胜的概率为:
P = Σ(x从0到w){Σ(y从0到x-1)[C(x+y-1,x-1)*C(w+b-x-y-1,w-x)] / C(w+b-1,w-1)}
其中C(n,m)表示从n个不同元素中取m个元素的组合数。具体地,C(n,m) = n! / (m! * (n-m)!)。
下面是C++的代码实现:
```cpp
#include <iostream>
using namespace std;
int main() {
int w, b;
cin >> w >> b;
double ans = 0.0;
for (int x = 1; x <= w; x++) {
double p = (double)x / (x + b);
double q = 1.0 - p;
double sum = 0.0;
for (int y = 0; y < x; y++) {
double tmp = 1.0;
tmp *= (w - x + y + 1);
tmp /= (w + b - x - y);
tmp *= (x - y);
tmp /= (y + 1);
sum += tmp;
}
ans += p * sum;
}
cout.precision(12);
cout << fixed << ans << endl;
return 0;
}
```
输入格式为两个整数w和b,表示超甜糖豆和普通糖豆的数量。输出小Q获胜的概率,保留12位小数。
用python做下题 提目:抓糖豆,小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w个超甜糖豆和b个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。 输入描述:输入两个整数w,b。(0<=w,b<=1000) 输出描述:答案保留9位小数。
这是一个经典的动态规划问题,可以使用递归和记忆化搜索来解决。定义一个函数`win_probability(w, b)`,表示在有w个超甜糖豆和b个普通糖豆的情况下,小Q获胜的概率。
根据题目要求,如果超甜糖豆数量为0,小Q必输,概率为0。如果超甜糖豆数量大于0,小Q有两种选择:
1. 小Q吃一个超甜糖豆,变成有w-1个超甜糖豆和b个普通糖豆的情况。此时轮到小K先吃,小Q的获胜概率为`win_probability(w-1, b)`。
2. 小Q吃一个普通糖豆,变成有w个超甜糖豆和b-1个普通糖豆的情况。此时轮到小K先吃,小Q的获胜概率为`win_probability(w, b-1)`。
综上所述,可以得到递归的表达式:`win_probability(w, b) = w / (w + b) + (b / (w + b)) * win_probability(w, b-1)`。
为了避免重复计算,可以使用一个字典来保存中间结果。具体代码实现如下:
```python
def win_probability(w, b, memo={}):
if w == 0:
return 0.0
if b == 0:
return 1.0
if (w, b) in memo:
return memo[(w, b)]
total = w + b
probability = w / total + (b / total) * win_probability(w, b-1)
memo[(w, b)] = probability
return probability
w, b = map(int, input().split())
result = win_probability(w, b)
print("{:.9f}".format(result))
```
注意,在递归函数中,首先检查是否已经计算过当前情况的结果,如果是则直接返回,避免重复计算。同时,为了保证输出精度,使用`"{:.9f}".format(result)`将结果保留9位小数。
希望对你有所帮助!
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)