AcWing,第114场周赛-5058双色球

发布时间 2023-07-31 18:57:51作者: liuwansi

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;
}