hdu 4465 Candy(二次项概率)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4465

参考博客:http://www.cnblogs.com/goagain/archive/2012/11/20/2778633.html

看他的分析足够了

下面的代码也是他写的,觉得优美就贴下来:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;


double solve(int n,double p)
{
    double ret = p*n;
    double last = 1;
    for(int m=n+1; m<=2*n; m++)
    {
        last *= (1-p)*(m)/(m-n)*p;
        ret += last*(2*n-m);    //这里的last是取m个糖时候的概率*C(m,n),不包含后面的(2*n-m);
        ret *= p;         //把p分别乘进去
    }
    return ret;
}   //精美的代码,很好的规避了溢出和精度问题。
int main()
{
   // freopen("E:\acm\input.txt","r",stdin);
    int n;
    double p;
    double ans;
    int T = 0;

    while(cin>>n>>p)
    {
        ans = 0;
        ans += solve(n,p);
        ans += solve(n,1-p);

        printf("Case %d: %.6lf
",++T,ans);
    }
}
View Code
原文地址:https://www.cnblogs.com/acmdeweilai/p/3352859.html