抓糖豆,小Q与小K都喜欢吃糖豆。 但是糖豆分两种,超甜糖豆和普通糖豆。 现在有w个超甜糖豆和b个普通糖豆。 小Q和小K开始吃糖豆,他们决定谁先吃到超甜糖豆谁就获胜。 小K每次吃的时候会捏碎一颗糖豆。 小Q先吃,小Q想知道自己获胜的概率。 如果两个人都吃不到超甜糖豆小K获胜。输入两个整数w,b。(0<=w,b<=1000).答案保留9位小数。用C语言编写程序实现
时间: 2023-05-26 18:02:00 浏览: 209
#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位小数。
可以使用动态规划来解决这个问题。假设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。
希望能帮到你!
阅读全文