oj_470 Red is good

来源:互联网 发布:嗟乎读音是什么 编辑:程序博客网 时间:2024/04/30 13:08

题目描述

Problem 470: Red is good
Time Limit: 1000 ms
Memory Limit: 524288 KB

Problem Description

桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。 输出答案时,小数点后第六位后的全部去掉,不要四舍五入.

Input

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

Output

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

Sample Input

5 1

Sample Output

4.166666

题解

概率期望

和的期望==期望的和
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
可以用滚动数组

所以
f【i】【j】表示剩余i个red,j个black的期望值
滚动后f【j】表示剩余j个black的期望值
因为期望值为负时,还不如break
所以f[j]=max(f[j],(double)0);
最后要注意精度问题
f【m】=f【m】-0.0000005

代码

#include<cstdio>#include<iostream>#include<cmath>#define N 5010using namespace std;double f[N];int n,m;int main(){    scanf("%d%d",&n,&m);    for(int i=0;i<=n;i++){        for(int j=0;j<=m;j++){            if(i>0)f[j]=((double)i/(double)(i+j))*(f[j]+1); //转移            if(j>0)f[j]+=((double)j/(double)(i+j))*(f[j-1]-1);            f[j]=max(f[j],(double)0);        }    }    printf("%.6f\n",f[m]-0.0000005);}
0 0
原创粉丝点击