题意:
给两个盒子里面都有n个糖果,每次从第一个盒子里拿糖果的概率是p,另一个是1-p
问当拿完一个盒子时,另一个盒子还有多少糖果的期望。
其中有一点就是,当她打开盒子发现是空的时候 会去打开另一个盒子在同一天。
思路:
期望公式很好推:
但是推完就会出现各种溢出问题
所以要用对数优化
代码:
#include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"algorithm" #include"map" #define eps 1e-6 #define ll __int64 #include"iostream" using namespace std; double Log[423000],logp,logq; double fc(int m,int k,double p,double q,int sum) { double ans=0; ans=Log[m]-Log[k]-Log[m-k]; ans+=p*(k+1); ans+=q*sum; return exp(ans); } int main() { Log[0]=0; for(int i=1;i<=400000;i++) Log[i]=Log[i-1]+log(i*1.0); int n,cas=1; double p; while(scanf("%d%lf",&n,&p)!=-1) { double ans=0; logp=log(p); logq=log(1-p); for(int i=n; i<=2*n; i++) { ans+=fc(i,n,logp,logq,i-n)*(2*n-i)+fc(i,n,logq,logp,i-n)*(2*n-i); } printf("Case %d: %lf\n",cas++,ans); } return 0; }
时间: 2024-10-11 22:50:55