BZOJ——1419: Red is good
阿新 • • 發佈:2017-11-19
fin std content source max read href 輸出 表示 Time Limit: 10 Sec Memory Limit: 64 MB
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 1Sample Output
4.166666HINT
輸出答案時,小數點後第六位後的全部去掉,不要四舍五入.
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 #definemax(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