zoukankan      html  css  js  c++  java
  • 紫书 例题 10-17 UVa 1639(数学期望+对数保存精度)

    设置最后打开的是盒子1, 另外一个盒子剩下i个

    那么在这之前打开了n + n - i次盒子

    那么这个时候的概率是C(2 * n - i, n) p ^ (n+1) (1-p)^ (n - i)

    那么反过来最后打开的是盒子2, 那么概率是C(2 * n - i, n) p ^ (n-i) (1-p)^ (n +1)

    那么当前的概率就是两个加起来,然后乘以权值,即i就可以了

    所以枚举所有的i加起来就好了。

    但这样会损失很多精度, 所以我们可以用对数

    也就是说算的时候先取对数来算,后来再取回去 

    不要忘记乘上权值

    另外组合数取对数可以先预处理对数和,详情见代码

    #include<cstdio>
    #include<cmath>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    const int MAXN = 412345;
    long double logF[MAXN];
    
    long double logc(int n, int m) 
    { 
    	return logF[n] - logF[m] - logF[n-m];
    }
    
    int main()
    {
    	REP(i, 1, MAXN) logF[i] = logF[i-1] + log(i);
    	int n, kase = 0;
    	double p;
    	
    	while(~scanf("%d%lf", &n, &p))
    	{
    		double ans = 0;
    		REP(i, 0, n + 1)
    		{
    			long double c = logc(2 * n - i, n);
    			long double v1 = c + (n + 1) * log(p) + (n - i) * log(1 - p);
    			long double v2 = c + (n - i) * log(p) + (n + 1) * log(1 - p);
    			ans += i * (exp(v1) + exp(v2));
    		}
    		printf("Case %d: %.6lf
    ", ++kase, ans);
    	} 
    
    	return 0;
    }
  • 相关阅读:
    js 抓取距离的方法
    mysql 设置账户权限
    mysql 主从复制
    mysql 分区
    linux 安装samba
    linux 配置lamp
    linux 本地虚拟机配置
    linux 权限
    linux 磁盘分区
    mysql-进阶 if/while/case
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819502.html
Copyright © 2011-2022 走看看