题意:有两个盒子各有n个糖,每次随机选一个(概率分别为p,1-p),然后吃掉,直到有一次,你打开盒子发现,没糖了!

输入n,p,求另一个盒子里糖的个数的数学期望。

析:先不说这个题多坑,首先要用long double来实现高精度,我先用的double一直WA,后来看了题解是用long double,

改了,可一直改不对,怎么输出结果都是-2.00000,搞了一晚上,真是无语,因为我输入输出数据类型是long double,

结果一直不对 ,可能是我的编译器是C89的吧,和C语言,输入输出格式不同,但是我改成C99也不对。。。

最后一看题解明白了,输入输出不需要那么高的精度,用double就足够了,可算是废了一晚上的时间。。。悲惨

下面分析这个题:

首先我们不知道最后打开的是哪个盒子,所以我们需要都考虑,当最后打开是第一个时,此时另一个有i个,那么在些之前一定是打开过

n+(n-i)次盒子,其中n次是第一个盒子,n-i次是第二个盒子,这是明显是一个二项分布,所以概率为C(2n-i, n)pn+1(1-p)n-i,这个地方

一定要注意是n+1,不是n,因为我们也要把最后一次的算上。

这个式子很明显是正确的,但是有一个大问题,那就是C(2n-i, n)这数据实在是太大了(因为n太大了),肯定无法用整形保存,

甚至无法用浮点保存,所以我们对它进行高精度处理,大数选的是对数法,令v1(i) = ln(C(2n-i, n)) + (n+1)ln(p) + (n-i)ln(1-p).

这个地方一定是加减,不是乘除,这是对数,刚开始又忘了,结果一直不对。。。

那么最后打开的是第一个盒子数学期望是ev1(i)

同理最后一个打开的是第二个盒子时,对数为v2(i) = ln(C(2n-i, n)) + (n+1)ln(1-p) + (n-i)ln(p),概率为ev2(i)

那么总的数学期望是sum{i*(ev1(i)+ev2(i))}((ev1(i)+ev2(i))这个是概率)。

这个题需要高精度,所以用long double来存储,真是坑。。。。很难想到。

代码如下:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath> using namespace std;
typedef long double LD;
const int maxn = 400000 + 10;
LD log_ld[maxn]; void init(){
log_ld[1] = 0.0;
for(int i = 2; i < maxn; ++i)
log_ld[i] = log_ld[i-1] + (LD)log((LD)i);
} double solve(int n, LD p){
LD ans = 0.0;
for(int i = 1; i <= n; ++i)
ans += (LD)i * exp(log_ld[2*n-i] - log_ld[n] - log_ld[n-i] + (LD)(n+1)*log(p) + (LD)(n-i)*log(1.0-p)); for(int i = 1; i <= n; ++i)
ans += i * exp(log_ld[2*n-i] - log_ld[n] - log_ld[n-i] + (LD)(n+1)*log(1.0-p) + (LD)(n-i)*log(p));
return ans;
} int main(){
// freopen("in.txt", "r", stdin);
int n, kase = 0;
double p;
init(); while(~scanf("%d %lf", &n, &p)){
double ans = solve(n, p);
printf("Case %d: %.6f\n", ++kase, ans);
}
return 0;
}

UVa 1639 Candy (数学期望+组合数学+高精度存储)的更多相关文章

  1. 紫书 例题 10-17 UVa 1639(数学期望+分数处理+处理溢出)

    设当前有k个,那么也就是说拿到其他图案的可能是(n-k)/n 那么要拿到一个就要拿n/(n-k)次 所以答案就是n(1/n + 1/(n-1) ......1/2 + 1 / 1) 看起来很简单,但是 ...

  2. 紫书 例题 10-17 UVa 1639(数学期望+对数保存精度)

    设置最后打开的是盒子1, 另外一个盒子剩下i个 那么在这之前打开了n + n - i次盒子 那么这个时候的概率是C(2 * n - i, n) p ^ (n+1) (1-p)^ (n - i) 那么反 ...

  3. UVa 1639 - Candy(数学期望 + 精度处理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVA - 1639 -Candy

    题目链接:https://vjudge.net/problem/UVA-1639 题目大意: 有两个糖果盒,每个盒子里面有n个糖果,每天随机选一个(概率分别为p,1-p),然后吃一颗糖.直到有一天,打 ...

  5. uva 1639 Candy (对数处理精度)

    https://vjudge.net/problem/UVA-1639 有两个盒子各有n(n≤2*10 5 )个糖,每天随机选一个(概率分别为p,1-p),然后吃一颗糖. 直到有一天,打开盒子一看,没 ...

  6. 紫书 例题 10-16 UVa 12230(数学期望)

    感觉数学期望的和化学里面求元素的相对原子质量的算法是一样的 就是同位素的含量乘上质量然后求和得出 这道题因为等待时机是0到2*l/v均匀分配的,所以平均时间就是l/v 再加上过河的l/v, 最后加上步 ...

  7. UVA 1639 Candy (组合数+精度)

    题意:两个箱子,每个箱子有n颗糖,每次有p的概率拿1号箱子的一颗糖出来(有1-p的概率拿2号箱子的一颗糖出来),问当打开某个箱子为空的时候,另一个箱子的期望糖的数量是多少 题解:枚举另一个箱子的糖的数 ...

  8. UVA - 1639 Candy (概率,精度)

    X表示剩下的糖数量,如果最后打开的是p对应的盒子.划分:Xi表示剩下i个糖,最后一次选的概率为p, 前面的服从二项分布.根据全概率公式和期望的线性性,求和就好了. 精度处理要小心,n很大,组合数会很大 ...

  9. 数学期望和概率DP题目泛做(为了对应AD的课件)

    题1: Uva 1636 Headshot 题目大意: 给出一个000111序列,注意实际上是环状的.问是0出现的概率大,还是当前是0,下一个还是0的概率大. 问题比较简单,注意比较大小: A/C & ...

随机推荐

  1. 递归实现tree JQuery

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. visual c++ 中的stdafx.h头文件的作用

    stdafx.h VC工程里面经常见到stdafx.h这个头文件,以前也没有特别注意,但是这个文件用不好经常会出错,所以就GOOGLE了一下,总算是弄清楚了... stdafx的英文全称为:Stand ...

  3. 协同过滤 spark scala

    1 http://www.cnblogs.com/charlesblc/p/6165201.html [转载]协同过滤 & Spark机器学习实战 2 基于Spark构建推荐引擎之一:基于物品 ...

  4. hive sql split 分隔符

    Hive字符串分割函数 split(str, regex) - Splits str around occurances that match regexTime taken: 0.769 secon ...

  5. innerText 与textContent区别

    两者都是可以过滤html元素 innerText 获取内容 换行会有L类似特殊符号 textContent 没有

  6. urllib.parse.urldefrag(url)的解释

    引自https://www.cnblogs.com/ublue/articles/4471210.html 1.URL hash(片段标识符) 任一带#的URL称为片段URL(通常称为URL hash ...

  7. java 用volatile和不用volatile的区别

    在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写.这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值 ...

  8. MySql ERROR 1045 (28000): Access denied 错误

    [MySql ERROR 1045 (28000): Access denied 错误] 即登陆错误,使用MySql登陆时,需使正确的username/passwd.通过 -u -p 参数即可. My ...

  9. Web标准:五、超链接伪类

    Web标准:五.超链接伪类 知识点: 1.链接的四种样式 2.将链接转换为块状 3.用css制作按钮 4.首字下沉   1)链接的四种样式 超链接有四个伪类,分别是: a:link 未访问的链接 a: ...

  10. [leetcode]163. Missing Ranges缺失范围

    Given a sorted integer array nums, where the range of elements are in the inclusive range [lower, up ...