题意:一场宴会,将会一直举办直到硬币投出第k次正面向上,正面向上的概率为p。另外,第i天的宴会将会花费2i-1的钱,问最后宴会结束期望以及花钱期望。

题解:递推求期望,设dp1[i]为已经抛出i次正面时,结束时间的期望,dp2[i]为已经抛出i次正面时,结束金钱的期望。

dp1[i]=(dp1[i]+1)*(1-p)+dp1[i+1]*p   ==>  dp1[i]=dp[i+1]+1/p

假设宴会会矩形m天,第一天花费1,第二天花费3.......等价于第m天花费1,第m-1天花费3......

所以,有了dp1,dp2[i]=(dp2[i+1]+(dp1[i+1]+1)*2-1)*p+(dp2[i]+(dp1[i]+1)*2-1)*(1-p)  ==>  dp2[i]=dp2[i+1]+2*dp1[i+1]+1+(1-p)/p*(2*dp1[i]+1)

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 double dp1[1005],dp2[1005];
 6 int main()
 7 {
 8     int n;
 9     double p;
10     while(scanf("%d",&n),n)
11     {
12         scanf("%lf",&p);
13         dp1[n]=0;
14         dp2[n]=0;
15         for(int i=n-1;i>=0;i--)
16         {
17             dp1[i]=dp1[i+1]+1.0/p;
18             dp2[i]=dp2[i+1]+2*dp1[i+1]+1+(1-p)/p*(2*dp1[i]+1);
19         }
20         printf("%.3lf %.3lf\n",dp1[0],dp2[0]);
21     }
22     return 0;
23 }