ZOJ 3551 Bloodsucker [概率DP]

原创 2015年11月20日 17:42:08

Description

In 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them meet. Nothing will happen if they are of the same species, that is, a people meets a people or a bloodsucker meets a bloodsucker. Otherwise, people may be transformed into bloodsucker with probability p. Sooner or later(D days), all people will be turned into bloodsucker. Calculate the mathematical expectation of D.

Input

The number of test cases (TT ≤ 100) is given in the first line of the input. Each case consists of an integer n and a float number p (1 ≤ n< 100000, 0 < p ≤ 1, accurate to 3 digits after decimal point), separated by spaces.

Output

For each case, you should output the expectation(3 digits after the decimal point) in a single line.

题意:

有N个村民,其中1个是吸血鬼,每天都有恰好两个村民互相碰面,如果碰面的是吸血鬼和正常人,则有p的概率让后者变为吸血鬼,问全部村民变成吸血鬼的期望天数。

范围:

N<=10w

解法:

很明显的概率DP,设DP[I]为I个人变成吸血鬼的期望天数,那么DP[1]=0,DP[I]=DP[I-1]+ E 其中E是在 I-1个吸血鬼,N-I+1个人中制造出一个吸血鬼的期望天数,可知每一天都有 p*(I-1)*(N-I+1)/ C(2,N)的概率制造出一个吸血鬼,记为Tp,其满足几何分布,期望为1/ Tp

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<iostream>
#include<stdlib.h>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<bitset>
#pragma comment(linker, "/STACK:1024000000,1024000000")
template <class T>
bool scanff(T &ret){ //Faster Input
    char c; int sgn; T bit=0.1;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    if(c==' '||c=='\n'){ ret*=sgn; return 1; }
    while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10;
    ret*=sgn;
    return 1;
}
#define inf 1073741823
#define llinf 4611686018427387903LL
#define PI acos(-1.0)
#define lth (th<<1)
#define rth (th<<1|1)
#define rep(i,a,b) for(int i=int(a);i<=int(b);i++)
#define drep(i,a,b) for(int i=int(a);i>=int(b);i--)
#define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next)
#define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++)
#define mem(x,val) memset(x,val,sizeof(x))
#define mkp(a,b) make_pair(a,b)
#define findx(x) lower_bound(b+1,b+1+bn,x)-b
#define pb(x) push_back(x)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;

double dp[100100];
int main(){
    tdata{
        int n;
        double p;
        scanff(n);
        scanff(p);
        dp[1]=0.0;
        double tot=double(n)*double(n-1)/2.0;
        rep(i,2,n){
            double b=double(i-1);
            double a=double(n-i+1);
            double tp=p*a*b/tot;
            dp[i]=dp[i-1]+1/tp;
        }
        printf("%.3f\n",dp[n]);
    }
    return 0;
}


版权声明:文為博主原創文章,未經博主允許不得轉載。

(概率DP)正向推概率,反向推期望

为什么要正向推概率,反向推期望呢? 首先,我们看看什么是条件概率。 然后,我们再看看什么是贝叶斯公式。...
  • nameofcsdn
  • nameofcsdn
  • 2016年08月01日 09:05
  • 2129

HDU 4336 概率DP求期望(or容斥原理)

题意: 有N(1
  • c3568
  • c3568
  • 2013年08月11日 16:52
  • 1426

ACM 中的期望,概率 问题

一个简易的入门:点击打开链接 kuangbin的总结:点击打开链接 我搞的题目:点击打开链接 前段时间一直在做概率的题目。 一、期望 其中求解期望问题刚开始一直不理解。后来做得多了有感觉。 例:(有放...
  • gg_gogoing
  • gg_gogoing
  • 2015年01月25日 10:33
  • 2940

zoj 3551 Bloodsucker (概率dp)

一共有n个人,每天都会有一个人又一定的几率变成吸血鬼,求所有人变成吸血鬼的期望 这题我只能说呵呵。。。。 推导公式dp[i]=(dp[i+1]+1)*p1+(dp[i]+1)*p2 变为:p1*dp[...
  • My_ACM_Dream
  • My_ACM_Dream
  • 2014年12月05日 00:26
  • 351

ZOJ3551 Bloodsucker(概率dp)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 Bloodsucker Time Limi...
  • u014330247
  • u014330247
  • 2014年03月26日 00:21
  • 477

ZOJ3551:Bloodsucker(概率DP)

n 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them meet. Nothing...
  • libin56842
  • libin56842
  • 2013年08月19日 00:17
  • 1672

ZOJ 3551 Bloodsucker 概率DP

题目大意: 就是现在一个城镇里有n - 1个居民, 1个吸血鬼, 每天晚上都有且只会有两个生物见面, 只有当两个见面的物种不同时, 有p的概率人会变成吸血鬼, 为经过多少个晚上城镇里所有的人都会变成...
  • u013738743
  • u013738743
  • 2014年12月24日 18:52
  • 511

ZOJ 3551 Bloodsucker

这是今天比赛中的一道题目,比赛的时候没弄懂怎么做,那时候对期望忘没了啊、、后来比赛结束之后才知道只是一道概率DP的题目、、可是不太会啊,所以就问同学+看题解终于弄懂了啊、、不容易啊、、 题意:一共有...
  • xu12110501127
  • xu12110501127
  • 2013年08月24日 16:24
  • 2150

zoj3551---Bloodsucker

Bloodsucker Time Limit: 2 Seconds      Memory Limit: 65536 KB In 0th day, there are n-1 peo...
  • Guard_Mine
  • Guard_Mine
  • 2014年12月22日 21:47
  • 594

ZOJ-3329-One Person Game【7th浙江省赛】【概率dp】

ZOJ-3329-One Person Game
  • loy_184548
  • loy_184548
  • 2016年02月23日 23:04
  • 516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ZOJ 3551 Bloodsucker [概率DP]
举报原因:
原因补充:

(最多只允许输入30个字)