HDU 4870 Rating (2014 多校联合第一场 J)(概率)

题意:

一个人有两个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
",2*sum-t[19]);//按照比赛规则,一个账号到20分的比赛次数=两个账号到20分的次数减去一个账号从19分到二十分的比赛次数
24     }
25     return 0;
26 }
原文地址:https://www.cnblogs.com/PJQOOO/p/4656694.html