1419: Red is good
Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 642 Solved: 249
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
解题思路:同样求得是最优决策下的期望,还是倒着递推。
但是由于内存太小,所以一定要滚动数组。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int r,b;
double f[3][5010];
inline int read()
{
char y; int x=0,f=1; y=getchar();
while (y<'0' || y>'9') {if (y=='-')f=-1; y=getchar();}
while (y>='0' && y<='9') {x=x*10+int(y)-48; y=getchar();}
return x*f;
}
int main()
{
r=read(); b=read();
for (int i=r;i>=0;--i)
{
for (int j=b;j>=0;--j)
if (i!=r || j!=b)
{
if (i==r) {f[2][j]+=max(0.0,f[2][j+1]-1);}else
if (j==b) {f[2][j]+=max(0.0,f[1][j]+1);}else
{
f[2][j]+=max(0.0,(f[2][j+1]-1)*double(b-j)/(b-j+r-i)+(f[1][j]+1)*double(r-i)/(b-j+r-i));
}
}
memcpy(f[1],f[2],sizeof(f[1]));
memset(f[2],0,sizeof(f[2]));
}
printf("%.6lf",f[1][0]-5e-7);
}