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

 

posted @ 2013-08-08 09:41  淡墨æ末央  阅读(200)  评论(0编辑  收藏  举报