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;
}


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

相关文章推荐

zoj 3551 Bloodsucker (概率dp)

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

ZOJ3551 Bloodsucker(概率dp)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 Bloodsucker Time Limi...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

ZOJ3551:Bloodsucker(概率DP)

n 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them meet. Nothing...

ZOJ 3551 Bloodsucker 概率DP

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

ZOJ 3551 Bloodsucker

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

zoj3551---Bloodsucker

Bloodsucker Time Limit: 2 Seconds      Memory Limit: 65536 KB In 0th day, there are n-1 peo...

ZOJ 2949 Coins of Luck(概率dp)

【链接】 【题意】给一个图,图中数值为炸弹的威力k(为0则该格没有炸弹),每个炸弹爆炸会引爆其【左侧k个格子】和【上方全部格子】,问最少手动引爆几个炸弹能使所有炸弹都炸 【思路】 一个炸弹只能引...

zoj 3329 One Person Game(概率dp,期望)

One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There i...

ZOJ-3711-Give Me Your Hand【概率dp】【10th浙江省赛】【好题】

题目大意:一个寝室有k个人(包括A和B),A要做坏事,B能组织A做坏事(最多阻止M次),问阻止次数的期望。 A开始做坏事的条件:在寝室连续呆T分钟,则开始做坏事 A停止做坏事的条件:离开寝室,或者,...

zoj 3735 概率dp

Josephina and RPG Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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