AcWing,第114场周赛-5058双色球
5058.双色球
约翰和贝茜玩抽球游戏。
一个盒子中有 n个白球和 m个黑球。
双方轮流行动,由约翰先行。
每当轮到一方行动时,其从盒中随机抽出一个球,盒子中的每个球被抽出的概率相同。
率先抽出白球的一方获胜。
此外,由于贝茜的手比较笨拙,所以每当她抽出一个球后,盒子都会剧烈摇晃,随后就会有恰好一个球掉出盒子(如果盒中有球的话),盒子中的每个球掉出的概率相同。
掉出的球无论是什么颜色,都予以作废。
当盒子中没有球时,如果仍未分出胜负,则判定为贝茜获胜。
请你计算,约翰获胜的概率。
输入格式
一行,两个整数 n,m。
输出格式
一个实数,表示约翰获胜的概率。
输出结果与正确答案的绝对误差不超过 1e−9,则视为正确。
数据范围
前 4个测试点满足 0≤n,m≤100。
所有测试点满足 0≤n,m≤1000。
输入:
1 3
输出:
0.500000000
输入样例2:
5 5
输出样例2:
0.658730159
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m;
double f[N][N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
double p1 = 0,p2 = 0,p3 = 0;
p1= i*1.0 / (i+j);
double p4 = j*1.0/(i+j)*(j-1)/(i+j-1);
if(j>=2)
p2 = p4*i*1.0/(i+j-2)*f[i-1][j-2];
if(j>=3)
p3=p4*(j-2.0)/(i+j-2)*f[i][j-3];
f[i][j]=p1+p2+p3;
}
}
printf("%.10lf\n",f[n][m]);
return 0;
}