[概率+对数优化] hdu 4465 Candy

题意:

给两个盒子里面都有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

[概率+对数优化] hdu 4465 Candy的相关文章

Hdu 4465 Candy (快速排列组合+概率)

题目链接: Hdu 4465 Candy 题目描述: 有两个箱子,每个箱子有n颗糖果,抽中第一个箱子的概率为p,抽中另一个箱子的概率为1-p.每次选择一个箱子,有糖果就拿走一颗,没有就换另外一个箱子.问换箱子的时候,另外一个箱子中剩下糖果的期望值. 解题思路: 注意题目描述,其中任意一个箱子没有糖果,另一个箱子中剩下糖果个数的期望,而不是第一个箱子没有糖果.不是把其中一个箱子取空时,另一个箱子剩下糖果的期望,而是其中一个箱子取空再换另外一个箱子时,这个箱子的期望. 可以根据期望性质画出公式:an

hdu 4465 Candy 2012 成都现场赛

1 /** 2 对于大数的很好的应用,,缩小放大,,保持精度 3 **/ 4 #include <iostream> 5 #include <cmath> 6 #include <algorithm> 7 #include <cstdio> 8 using namespace std; 9 10 int main() 11 { 12 double n,p; 13 int cnt =1; 14 while(cin>>n>>p){ 15

HDU 4465 Candy(组合+log优化)

题目大意:给你两个罐子,里面有糖果每次只能从一个罐子里面取一个糖果,打开A的概率为p,问当一个罐子取完之后,另一个罐子剩糖果的期望是多少. 我们可以知道最少是取第n+1次的时候才会有一个罐子为空,我们可以推出组合公式: (n-k)*C(n+k, k)*((1-p)^(n+1)*p^k+(1-p)^k*p^(n+k)):0 <= k && k <= n-1. 求一个和就是所有的组合情况了,但是组合数很大我们可以用log来进行优化. 我们已知:C(n,m) = m!/n!/(m-n

hdu 4465 Candy (快速排列组合 )

Candy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2115    Accepted Submission(s): 910 Special Judge Problem Description LazyChild is a lazy child who likes candy very much. Despite being ve

HDU 4465 Candy

Candy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2520    Accepted Submission(s): 1100Special Judge Problem DescriptionLazyChild is a lazy child who likes candy very much. Despite being very

hdu 5291 Candy Distribution(dp)

题目链接:hdu 5291 Candy Distribution 每次先计算出dp[0],然后根据dp[0]的数值可以用o(1)的复杂度算出dp[1],以此类推.总体复杂度为o(200 * 80000),可以接受. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 80000; const int maxm = 205; cons

HDU 1034 Candy Sharing Game 模拟题

一个分糖游戏,找了会规律,没找到,只能直接模拟玩了. 果然0ms过了,看来数据不大,只是考编码能力罢了. #include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h> #include <stack> #

HDU 4780 Candy Factory

Candy Factory Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 478064-bit integer IO format: %I64d      Java class name: Main A new candy factory opens in pku-town. The factory import M machines to produce hig

hdu 1034 Candy Sharing Game

Candy Sharing Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4942    Accepted Submission(s): 3020 Problem Description A number of students sit in a circle facing their teacher in the cente