您的位置:首页 > 其它

hdu 4465 概率题

2014-10-18 21:14 260 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: