ZOJ 3551 Bloodsucker <概率DP>

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3551

题意:开始有N-1个人和一个吸血鬼, 每天有两个生物见面,当人遇到吸血鬼时有p的概率变成吸血鬼,求全部变成吸血鬼所需要的时间的期望~

思路: 设dp[i] 为还有 i 个人时,有一人变成吸血鬼的期望时间, p[i]为还有 i 个人时,有人变成吸血鬼的概率,

    那么p[i]= p*i(N-i)/(N*(N-1)/2)~  dp[i]=1/p[i];

    由 E(X)=∑E(X=xi) 得 E[N]=∑dp[i]~ 

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 using namespace std;

 5 const int N = 100010;

 6 double dp[N], p;

 7 int T, n;

 8 int main()

 9 {

10     scanf("%d", &T);

11     while(T--){

12         scanf("%d%lf", &n, &p);

13         dp[n] = 0;

14         for(int i = n - 1; i; --i){

15             double pi = p * i * (n - i) * 2 / n / (n - 1);

16             dp[i] = dp[i + 1] + 1 / pi;

17         }

18         printf("%.3lf\n", dp[1]);

19     }

20     return 0;

21 }
View Code

 

你可能感兴趣的:(ZOJ)