zoukankan      html  css  js  c++  java
  • 紫书 例题 10-20 UVa 10900(连续概率)

    分两类,当前第i题答或不答

    如果不回答的话最大期望奖金为2的i次方

    如果回答的话等于p* 下一道题的最大期望奖金

    那么显然我们要取最大值

    所以就要分类讨论

    我们设答对i题后的最大期望奖金为d[i] 

     显然临界点,也就是这两种情况相等的时候

    p0 = 2^i / d[i+1] 

    那么因为题目说概率在t到1之间

    所以p0最小为t,代码中要取max

    当前概率在t到1之间

    那么当p在t到p0这个范围内,p<p0,这个时候 p*d[i+1] < 2^i,那显然选 2^i

    在这个范围内的概率是 p1 =(p0 - t) / (1 - t)

    那么这个时候期望是 p1 *  2^i

    那么当p在p0到1这个范围内,p>=p0,这个时候 p*d[i+1] >= 2^i,那显然选 p*d[i+1]

    在这个范围内的概率是 (1-p1), 而p要取(1+p0)/2

    那么这个时候期望是(1+p0)/2 * d[i+1] * (1-p1)

    两种情况的期望值加起来就是递推公式了

    从d[n]=2^n递推到d[0]即为答案

    #include<cstdio>
    #include<cmath>
    #define REP(i, a, b) for(int i = (a); i < (b); i++)
    using namespace std;
    
    const int MAXN = 35;
    double d[MAXN];
    
    int main()
    {
    	int n;
    	double t;
    	while(~scanf("%d%lf", &n, &t) && n)
    	{
    		d[n] = 1 << n;
    		for(int i = n - 1; i >= 0; i--)
    		{
    			double p0 = fmax(t, (double)(1 << i) / d[i+1]);
    			double p1 = (p0 - t) / (1 - t);
    			d[i] = (1 << i) * p1 + (1 + p0) / 2 * d[i+1] * (1 - p1);
    		}
    		printf("%.3lf
    ", d[0]);
    	}	
    	return 0;
    }
  • 相关阅读:
    redis
    libevent简述
    IPC-本地套接字
    广播和组播
    UDP实现并发服务器
    select
    epoll
    BUUCTF-[极客大挑战 2019]HardSQL 1
    CTFHUB-Injection V2.0
    SQL注入中登录框只验证用户名情况下的绕过
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819499.html
Copyright © 2011-2022 走看看