Red is good题解 5.22

题目描述

桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

输入格式

一行输入两个数R,B,其值在0到5000之间

输出格式

在最优策略下平均能得到多少钱。

样例

样例输入

5 1

样例输出

4.166666

数据范围与提示

输出答案时,小数点后第六位后的全部去掉,不要四舍五入.


 

其实就是一个递推式
求选牌的期望
double一个f[i][j]表示还剩i个红牌,j个黑牌
f[i][j]=i/(i+j)*(f[i-1][j]+1)+j/(i+j)*(f[i][j-1]-1)
注意i>0时,前半部分成立,因为i=0时,i-1=-1  会re
同理j>0
!!!!!!!!!若f[i][j]<0 则把f[i][j]赋成0
因为f[i][j]<0还不如不选(此处的不选指一张都不选)
小窍门:可以直接-0.0000005以达成不四舍五入输出六位小数的目的
代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
int a,b;
double f[5010][5010];
int main()
{
    cin>>a>>b;
    for(int i=0;i<=a;i++)
        for(int j=0;j<=b;j++)
        {
            if(i>0)    f[i][j]=1.0*i/(i+j)*(f[i-1][j]+1);
            if(j>0)    f[i][j]+=1.0*j/(i+j)*(f[i][j-1]-1);
            if(f[i][j]<0)    f[i][j]=0;
        }
    printf("%.6lf",f[a][b]-0.0000005);
}

posted @ 2021-05-22 18:33  飞。畅  阅读(97)  评论(0)    收藏  举报