ZOJ 3551 Bloodsucker (概率DP)

ZOJ Problem Set - 3551

Bloodsucker


Time Limit: 2 Seconds      Memory Limit: 65536 KB



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.

Sample Input

1
2 1

Sample Output

1.000

Author: WU, Yingxin

Contest: ZOJ Monthly, October 2011

题目大意:

有 n-1 个人 和 1 个吸血鬼,然后每天有且只有会有两个相遇(可能是人和人,吸血鬼和吸血鬼,人和吸血鬼),当人和吸血鬼相遇时,被感染为吸血鬼的概率为p,问你全部变为吸血鬼的天数的数学期望。

解题思路:

用DP[i]记录还有i个人的时候,全部变为所需要的天数的期望,则:

令 px 表示  C(i,1)*C(n-i,1)/C(n,2)*p  , 也就是 选出1个吸血鬼1个人并且并传染的概率

则: DP[n-i]= 1  + px*DP[n-i-1] + ( 1- px ) *DP[n-i];

化简得到:DP[n-i]= 1.0/px + DP[n-i-1];

即: DP[n-i] = (n-1)*n*p / ( 2.0*i*(n-i) ) + DP[n-i-1];

解题代码:

#include <iostream>
#include <cstdio>
using namespace std;

typedef long long ll;

ll C(ll n,ll c){
    if(c>n) return 0;
    else if(c==n) return 1;
    else{
        ll ans=1;
        for(ll i=0;i<c;i++) ans*=(n-i);
        for(ll i=1;i<=c;i++) ans/=i;
        return ans;
    }
}

void solve(){
    ll n;
    double ans=0.0,p;
    scanf("%lld%lf",&n,&p);
    for(ll i=n-1;i>=1;i--){
        ans = 1.0*(n-1)*n / ( 2.0*i*(n-i)*p ) + ans;
    }
    printf("%.3lf\n",ans);
}

int main(){
    int t;
    scanf("%d",&t);
    while(t-- >0){
        solve();
    }
    return 0;
}

ZOJ 3551 Bloodsucker (概率DP),布布扣,bubuko.com

时间: 2024-08-07 17:00:56

ZOJ 3551 Bloodsucker (概率DP)的相关文章

ZOJ 3551 Bloodsucker(概率dp啊 )

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 Bloodsucker Time Limit: 2 Seconds      Memory Limit: 65536 KB In 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them meet. Nothing will happen if th

ZOJ3551 Bloodsucker(概率dp)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Bloodsucker Time Limit: 2 Seconds      Memory Limit: 65536 KB 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

zoj 3288 Domination (概率dp)

///dp[i][j][k]表示i行j列已经有棋子,且放了k个的概率 ///dp[i][j][k]一共有四种转移方式 ///1:dp[i-1][j][k-1] 概率为 (n-(i-1))*j/(n*m-(k-1)) ///2:dp[i][j-1][k-1] 概率为 i*(m-(j-1))/(n*m-(k-1)) ///3:dp[i-1][j-1][k-1] 概率为 (n-(i-1))*(m-(j-1))/(n*m-(k-1)) ///4:dp[i][j][k-1] 概率为 (i*j-(k-1))

zoj 3822 Domination 概率dp 2014牡丹江站D题

Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with his friends. What's more, he bought a large decorative chessboar

ZOJ 3329 【概率DP】

题意: 给你三个均匀k面筛子. 分别有k1 k2 k3个面,每个面朝上的概率是相等的. 如果第一个筛子出现a第二个筛子出现b第三个筛子出现c那么置零. 否则在当前和加上三个点数之和. 求当前和大于n需要的步数的期望. 思路: 一开始状态转移搞错了,手推公式交了WA,后来想了想状态转移的过程发现每个状态都跟0状态有关系,但是dp[0]不确定,但是幸运的是这是一个线性变换,所以状态转移的时候记录一下dp[0]的系数,最后移项输出就好了. dp[i]=dp[i+x]*(k1*k2*k3);(x=i+j

ZOJ 3822 Domination 概率DP

题意:在一个n*m的棋盘上放棋子,一个棋子可覆盖一行一列,若n行m列全被覆盖则停止放棋子,求棋子的期望 思路:期望DP, dp[i][j][k]表示放了i个棋子覆盖了j行k列 已知dp[0][0][0]=1,求dp[1~n*m][n][m] 四种情况: 1.再放一个棋子,行列都不增加 dp[i+1][j][k]+=dp[i][j][k]*(j*k-i)*1.0/(m*n-i); 2.只增加一行 dp[i+1][j+1][k]+=dp[i][j][k]*(n-j)*k*1.0/(m*n-i); 3

ZOJ 3822 Domination 概率DP求期望

Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with his friends. What's more, he bought a large decorative chessboar

【概率DP】 ZOJ 3380 Patchouli&#39;s Spell Cards

通道 题意:有m个位置,每个位置填入一个数,数的范围是1~n,问至少有L个位置的数一样的概率 思路: 总数是n^m,我们求没有L个位置一样的数的概率 * 设 dp[i][j]表示用前i个数,填充j个位置的方案数(要符合没有L个位置是一样的数) * dp[i][j]=dp[i-1][j]+Sigm( dp[i-1][j-k]*C[m-(j-k)][k] ) k<=j&&k<L * 其实就是看第i个数,可以不填,填一个位置,两个位置······这样累加过来. * 那么最后的答案就是

[ACM] ZOJ 3329 One Person Game (概率DP,有环,巧妙转化)

One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very simple and interesting one-person game. You have 3 dice, namely Die1, Die2 and Die3. Die1 has K1 faces. Die2 has K2 faces. Die3 has K3 faces. All the