设dp【i】为i分到i+1所需场次的期望值
dp[i]= p + (1-p)*(dp[i-2] + dp[i-1] + dp[i] +1)
化简得dp[i]= ( (1-p)*(dp[i-2] + dp[i-1]) +1 )/ p;
因为他注册了两个帐号,且每次都用分低的帐号去做比赛,则ans= 2*(dp[0] + ... dp[18]) + dp[19];
代码:
#include <stdio.h>
int main()
{
double dp[22];
double p;
while(scanf("%lf",&p)!=EOF)
{
dp[0]= 1/p;
dp[1]= dp[0]/p;
double ans= 2*(dp[0]+ dp[1]);
for(int i= 2; i<= 19; i++)
{
dp[i]=((1-p)*(dp[i-2]+dp[i-1]) +1 )/ p;
if(i!= 19)
ans+= 2*dp[i];
else
ans+= dp[i];
}
printf("%lf\n",ans);
}
return 0;
}