zoukankan      html  css  js  c++  java
  • 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 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

    题意:已知有n-1个人,1个吸血鬼,每天n个中会随机有两个碰面,若是人和吸血鬼相遇,则人有p的概率变成吸血鬼,问最终全部变吸血鬼的期望天数

    很明显,这是个概率dp题,dp[i]表示还剩i个人,那么dp[i] = dp[i+1] + 1 / P[i+1]

    其中P[i] = p*C(i,1)*C(n-i ,1) / C(n,2)

    /**
     * code generated by JHelper
     * More info: https://github.com/AlexeyDmitriev/JHelper
     * @author xyiyy @https://github.com/xyiyy
     */
    
    #include <iostream>
    #include <fstream>
    
    //#####################
    //Author:fraud
    //Blog: http://www.cnblogs.com/fraud/
    //#####################
    //#pragma comment(linker, "/STACK:102400000,102400000")
    #include <iostream>
    #include <sstream>
    #include <ios>
    #include <iomanip>
    #include <functional>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <list>
    #include <queue>
    #include <deque>
    #include <stack>
    #include <set>
    #include <map>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <cstring>
    #include <climits>
    #include <cctype>
    
    using namespace std;
    #define dep(X, R, L) for(int X=R;X>=L;X--)
    
    double dp[100010];
    
    class TaskC {
    public:
        void solve(std::istream &in, std::ostream &out) {
            int t;
            in >> t;
            while (t--) {
                int n;
                double p;
                in >> n >> p;
                dp[n - 1] = 0;
                double tot = (double) n * (n - 1) / 2 / p;
                dep(i, n - 2, 0) {
                    dp[i] = dp[i + 1] + tot / (i + 1) / (n - i - 1);
                }
                out << fixed << setprecision(3) << dp[0] << endl;
            }
        }
    };
    
    int main() {
        std::ios::sync_with_stdio(false);
        std::cin.tie(0);
        TaskC solver;
        std::istream &in(std::cin);
        std::ostream &out(std::cout);
        solver.solve(in, out);
        return 0;
    }
  • 相关阅读:
    [置顶] 搭建一个流媒体服务器引子
    Exchange Server 2007 常见问题解答(6)
    [置顶] 第九周项目1
    iOS 6应用开发实战
    hdu 1722(数论)
    js二维数组排序
    HDU 4027 线段树 Can you answer these queries?
    Socket编程指南及示例程序
    Spring攻略学习笔记(2.13)解析文本消息
    线性渐变lineargradient和滤镜opacity/filter的透明效果兼容性解决方案及其RGB/RGBA与16进制转换方法
  • 原文地址:https://www.cnblogs.com/fraud/p/4733469.html
Copyright © 2011-2022 走看看