Candy----HDU4465----数学题
来源:互联网 发布:免费域名加解析 编辑:程序博客网 时间:2024/05/01 00:59
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4465
题目意思:
有两个箱子,每个箱子装有N个糖果
打开第一个箱子的概率是P,另外一个就是1-P
当小明打开一个箱子的时候发现有糖果就会吃掉
有一天,小明打开其中的一个箱子,发现没有糖果了,求另外一个箱子的糖果数量的期望
这个公式其实是很好推的,枚举另外一个箱子剩余的数量来算就OK
这里的n经过了+1处理,这样我们枚举没有拿空的那个箱子里面拿了i个,那么剩下的就是n-i-1个
算概率的话,就是在前面的n+i-i次中我要在前面把拿空的箱子中拿n-1次再乘以概率p^n放,为什么前面是n-1,后面又是n呢?
因为最后一次一定要拿空的这个才可以,同理如果是另一个箱子
但是在算的时候不好算,因为要么是p^n后太小,要么是前面的组合数太大
所以只能边组合边乘
每次组合数可以用之前一个*(N+i-1)/i得到,为了避免爆double,
当数大于N(因为最终结果不可能大于N)的时候,乘以概率来减小,记录乘了多少次概率,最后算的时候少乘。
下面上代码:
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const double eps = 1e-12;double fun(double s,double p,int n){ while(n) { if(s<eps) return 0; if(n&1) s*=p; n = n>>1; p = p*p; } return s;}int main(){ int n; double p; int ca = 1; while(~scanf("%d%lf",&n,&p)) { double tmp1,tmp2; tmp1 = tmp2 = 1; double ans = 0; n++; int d=0; for(int i=0;i<n;i++) { if(i) { tmp1 = tmp1*(1-p)*(n+i-1)/i; tmp2 = tmp2*(p)*(n+i-1)/i; while(tmp1>n || tmp2>n) { tmp1 = tmp1*p; tmp2 = tmp2*(1-p); d++; } } ans += fun((n-i-1)*tmp1,p,n-d); ans += fun((n-i-1)*tmp2,1-p,n-d); } printf("Case %d: %.6f\n",ca++,ans); } return 0;}
除了这种方法以外,还有一种方法,神方法
就是在计算的时候会出现p^n这一步,太小,那么我们可以利用ln把n拿下来,然后再用e^n拿回去
具体见代码:
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;int main(){ int n; double p; double p1,p2,s1,s2; int ca = 1; while(~scanf("%d%lf",&n,&p)) { double c = 0; double ans = 0; p1 = log(p); p2 = log(1-p); //exp之后就是p^(n+1) or (1-p)^(n+1) s1 = (n+1)*p1; s2 = (n+1)*p2; for(int i=0;i<n;i++) { if(c+s1>-30 || c+s2>-30)//这一步一定要加,计算没意义,还会导致TLE ans += (exp(c+s1)+exp(c+s2))*(n-i); c+=log(n+i+1)-log(i+1); s1+=p2; s2+=p1; } printf("Case %d: %lf\n",ca++,ans); } return 0;}
- Candy----HDU4465----数学题
- Candy----HDU4465----数学题
- hdu4465 Candy
- HDU4465 Candy
- hdu4465 Candy(快速排列组合+概率)
- hdu4465 Candy(快速排列组合+概率)
- hdu4465
- hdu4465 期望公式
- HDU4465-数学期望
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- Candy
- softmax 函数
- hdu-又见GCD
- 关于fedora 16默认文本界面启动
- “绿色中国梦”爱心活动
- 再谈PHP、Python与Ruby
- Candy----HDU4465----数学题
- UML相关工具一览(截止2013年2月)
- POJ 2528 Mayor’s posters(离散化+成段更新)
- int __register_chrdev(unsigned int major, unsigned int baseminor,unsigned int count,
- Activity生命周期
- IE6 Bug解决方法HACK汇总
- Linux下SMI总线驱动
- 最短路径算法——Dijkstra算法
- 开始学习了!留个脚印!