题意:
一个人有两个TC的账号,一开始两个账号rating都是0,然后每次它会选择里面rating较小的一个账号去打比赛,每次比赛有p的概率+1分,有1-p的概率-2分,当然如果本身是<=2分的也就还是回到0分。然后问最后其中一个账号到达20分时需要打多少次比赛。
思路:
因为每次50分,到达1000分,所以可以看做每次1分,到达20分
dp[i]表示i到20的数学期望
那么dp[i] = dp[i+1]*p+dp[i-2]*q+1;
令t[i] = dp[i+1]-dp[i]
则t[i] = (t[i+1]*p+t[i-2]*q)
所以t[i+1] = (t[i]-t[i-2]*q)/p
代码:
1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 //t[i]为从i分到i+1分需要的比赛次数期望 5 int main() 6 { 7 double t[21],dp[21]; 8 double p,q,sum; 9 while(scanf("%lf",&p)!=EOF) 10 { 11 sum = 0; 12 q = 1-p; 13 t[0] = 1/p; 14 t[1] = t[0]/p; 15 t[2] = t[1]/p; 16 sum =t[0]+t[1]+t[2]; 17 for(int i=3;i<20;i++) 18 { 19 t[i]=(t[i-1]-t[i-3]*q)/p; 20 sum+=t[i]; 21 } 22 //sum为一个账号达到20分的平均比赛次数 23 printf("%.6lf\n",2*sum-t[19]);//按照比赛规则,一个账号到20分的比赛次数=两个账号到20分的次数减去一个账号从19分到二十分的比赛次数 24 } 25 return 0; 26 }
时间: 2024-10-12 16:01:12