1. 程式人生 > >BZOJ——1419: Red is good

BZOJ——1419: Red is good

fin std content source max read href 輸出 表示

http://www.lydsy.com/JudgeOnline/problem.php?id=1419

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1077 Solved: 491
[Submit][Status][Discuss]

Description

桌面上有R張紅牌和B張黑牌,隨機打亂順序後放在桌面上,開始一張一張地翻牌,翻到紅牌得到1美元,黑牌則付出1美元。可以隨時停止翻牌,在最優策略下平均能得到多少錢。

Input

一行輸入兩個數R,B,其值在0到5000之間

Output

在最優策略下平均能得到多少錢。

Sample Input

5 1

Sample Output

4.166666

HINT

輸出答案時,小數點後第六位後的全部去掉,不要四舍五入.

Source

f[r][b]表示選r個紅牌 b個黑牌在 最優策略 平均 能得到的錢

f[r][b]=max( 0, (f[r-1][b]+1)*r/(r+b)+(f[r][b-1]-1)*b/(r+b) )

//當前選一張紅牌的概率為r/(r+b),紅牌錢數+1,期望為f[r-1][b]+1)*r/(r+b),選黑牌類似

但是T了。。。然後、、需要用滾動數組優化第一維、

 1 #include <cstdio>
 2 
 3 #define
max(a,b) (a>b?a:b) 4 5 inline void read(int &x) 6 { 7 x=0; register char ch=getchar(); 8 for(; ch>9||ch<0; ) ch=getchar(); 9 for(; ch>=0&&ch<=9; ch=getchar()) x=x*10+ch-0; 10 } 11 12 const int N(5e3+5); 13 14 double f[N]; 15 int R,B;
16 17 int Presist() 18 { 19 read(R),read(B); 20 for(int r=1; r<=R; ++r) 21 { 22 f[0]=r; 23 for(int b=1; b<=B; ++b) 24 f[b]=max(0.00,1.*(f[b]+1)*r/(r+b)+ 25 1.*(f[b-1]-1)*b/(r+b)); 26 } 27 printf("%.6lf\n",f[B]-5e-7); 28 return 0; 29 } 30 31 int Aptal=Presist(); 32 int main(int argc,char**argv){;}

BZOJ——1419: Red is good