hdu 4465 Candy
2017-10-05 11:42
302 查看
Candy
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 6 Accepted Submission(s) : 5
Special Judge
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
LazyChild is a lazy child who likes candy very much. Despite being very young, he has two large candy boxes, each contains n candies initially. Everyday he chooses one box and open it. He chooses the first box with probability p and the second box with probability(1 - p). For the chosen box, if there are still candies in it, he eats one of them; otherwise, he will be sad and then open the other box.
He has been eating one candy a day for several days. But one day, when opening a box, he finds no candy left. Before opening the other box, he wants to know the expected number of candies left in the other box. Can you help him?
Input
There are several test cases.For each test case, there is a single line containing an integer n (1 ≤ n ≤ 2 × 105) and a real number p (0 ≤ p ≤ 1, with 6 digits after the decimal).
Input is terminated by EOF.
Output
For each test case, output one line “Case X: Y” where X is the test case number (starting from 1) and Y is a real number indicating the desired answer.Any answer with an absolute error less than or equal to 10-4 would be accepted.
Sample Input
10 0.400000 100 0.500000 124 0.432650 325 0.325100 532 0.487520 2276 0.720000
Sample Output
Case 1: 3.528175 Case 2: 10.326044 Case 3: 28.861945 Case 4: 167.965476 Case 5: 32.601816 Case 6: 1390.500000
分析:
这个题目是真的难,涉及的知识点很多,首先组合数求概率,在数学上是能够实现的,但是2e5计算机是无法胜任的,这里可以经由log转换一下,详细思路见代码。
代码如下 :
#include <iostream>
#include <string.h>
#include <cstdio>
#include <cmath>
using namespace std;
int n;
double p,inde[400005];
void init(){ //阶乘打表,底数相乘除,即指数相加减
inde[0]=0;
for(int i=1;i<=400000;i++)
inde[i]=inde[i-1]+log(i);
}
double v1(int i)//最后打开的是第一个盒子
{
double tem=inde[2*n-i]-inde
-inde[n-i]+(n+1)*log(p)+(n-i)*log(1-p);
return tem;
}
double v2(int i)//最后打开的是第二个盒子
{
double tem=inde[2*n-i]-inde
-inde[n-i]+(n+1)*log(1-p)+(n-i)*log(p);
return tem;
}
int main()
{
int cnt=0;
double ans;
init();
while(~scanf("%d%lf",&n,&p))
{
ans=0;
for(int i=1;i<=n;i++)
{
ans+=i*(exp(v1(i))+exp(v2(i)));//1~n次期望和,概率乘以结果
}
printf("Case %d: %lf\n",++cnt,ans);
}
return 0;
}
相关文章推荐
- hdu 4465 Candy
- hdu 4465 Candy (快速排列组合 )
- hdu 4465 Candy (概率期望)
- HDU 4465 Candy( 期望)
- Hdu 4465 Candy (快速排列组合+概率)
- hdu 4465 Candy 快速全排列
- hdu 4465 Candy
- Hdu 4465 Candy (概率 对数 组合数 负二项分布)
- HDU 4465 Candy
- HDU 4465 Candy 概率 (2012成都区域赛B题)
- hdu 4465 Candy(2012 ACM-ICPC 成都现场赛)
- HDU 4465 HDOJ Candy 2012ACM亚洲赛成都赛区B题
- HDU 4465 - Candy(概率与数学优化)
- HDU 4465 Candy
- HDU 4465 Candy--数学求期望
- hdu 4465 Candy 数学
- HDU 4465 Candy (数学期望)
- hdu 4465 Candy(概率公式+极大乘极小,4级)
- HDU 4465 Candy【指数表示法】E
- hdu 4465 Candy 数学期望 负二项分布与 数值计算技巧