hdu 4465 概率题

http://acm.hdu.edu.cn/showproblem.php?pid=4465

第一直觉概率DP但是很快否定,发现只是简单的二项分布,但是感觉式子对,死活对不上样例,然后发现精度问题,不会处理,

其实思想跟C的递推变成O(1)方法一样,每次乘以p

代码看这里http://fszxwfy.blog.163.com/blog/static/44019308201338114456115/

贴一个我没看懂的代码

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;

#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-8;
const double pi = acos(-1.0);
const int INF = 100000000;
double p1,p0;
int n;

double solve()
{
    p1=1.0-p0;
    double tmpa,tmpb;
    tmpa=tmpb=1.0;
    double ans=0.0;
    int last=n+1;
    for(int i=0;i<n;i++)
    {
        if(i)
        {
            tmpa=tmpa*(n+i)*p0/i;
            tmpb=tmpb*(n+i)*p1/i;
            while(tmpa>n || tmpb>n)
            {
                tmpa*=p1;
                tmpb*=p0;
                last--;
            }
        }
        ans+=(n-i)*tmpa*pow(p1,last)+tmpb*(n-i)*pow(p0,last);
    }
    return ans;
}

int main()
{
    //IN("hdu4465.txt");
    int ic=0;
    while(~scanf("%d%lf",&n,&p0))
    {
        printf("Case %d: %.6lf\n",++ic,solve());
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值