题目地址: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----数学题的更多相关文章

  1. HDU4465 Candy

    Candy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. [LeetCode] Candy 分糖果问题

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  3. Leetcode Candy

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  4. LeetCode 135 Candy(贪心算法)

    135. Candy There are N children standing in a line. Each child is assigned a rating value. You are g ...

  5. [LeetCode][Java]Candy@LeetCode

    Candy There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  6. 【leetcode】Candy(hard) 自己做出来了 但别人的更好

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

  7. ytu 2558: 游起来吧!超妹!(水题,趣味数学题)

    2558: 游起来吧!超妹! Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3[Submit][Status][Web Board ...

  8. 【leetcode】Candy

    题目描述: There are N children standing in a line. Each child is assigned a rating value. You are giving ...

  9. Codeforces Round #229 (Div. 2) C. Inna and Candy Boxes 树状数组s

    C. Inna and Candy Boxes   Inna loves sweets very much. She has n closed present boxes lines up in a ...

  10. [LintCode] Candy 分糖果问题

    There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...

随机推荐

  1. 关于表格动态添加行并处理相关表单元素的一些修改----优化for重用(2)

    功能介绍: 1.处理了动态行与表单的设值问题 2.添加了行的向上或向下排序 3.添加了可以在当前行的下边或上边增加新行的功能 4.添加了可以单选或勾选多项删除不需要的行的功能 5.添加了新增的行的高亮 ...

  2. 对于一些css样式的巧妙方法进行总结。

    针对之前遇到过的一些特殊样式的实现,我今天做个总结,目的有二:一是将这些方法记录下来,以便将来需要用到时查找使用.二为将这些大神们智慧的结晶发扬光大,让广大前端程序猿们能够少走弯路.此贴为更新帖,以后 ...

  3. 对config配置文件的读取和修改

    在c#中想要使用对congfig文件的操作必要引用一个dll“system.configuration.dll” 读取 : string  str= System.Configuration.Conf ...

  4. struts2笔记04-XxxAware接口

    1.XxxAware接口 ApplicationAware, RequestAware,SessionAware, ParameterAware.      struts2提供了这四个Aware接口用 ...

  5. Delphi 对泛型TList的的改进(TSimpleList)

    TList 有一个比较麻烦的问题是,到底由谁来释放List中的对象或指针. 本例将释放任务教给 TSimpleList ,方便使用. 如果 TList 为于管理对象,还可以实现 AddNewOne 功 ...

  6. MyBatis 最常见错误,启动时控制台无限输出日志

    你是否遇到过下面的情况,控制台无限的输出下面的日志: Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImp ...

  7. C. Table Decorations(Codeforces Round 273)

    C. Table Decorations time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. EJBCA认证系统结构及相关介绍

    写作此文的主要目的是记录下EJBCA认证系统的系统结构及相关部件作用的介绍,方便后面查阅使用.

  9. 53个Oracle语句优化规则详解(转)

    Oracle sql 性能优化调整  1. 选用适合的ORACLE优化器        ORACLE的优化器共有3种:a. RULE (基于规则)   b. COST (基于成本) c. CHOOSE ...

  10. 红豆带你从零学C#系列之:开始C#编程(一)

    让我们开始学习C#编程吧 作者:红豆西米露 交流QQ:937802080 前面的文章里给大家介绍了C#语言的一些基本认识,现在我们来开始做一个小程序吧! 在这里以我们以“控制台应用程序”来作演示. P ...