• UVa 10900 (连续概率、递推) So you want to be a 2n-aire?


    题意:

    初始奖金为1块钱,有n个问题,连续回答对i个问题后,奖金变为2i元。

    回答对每道题的概率在t~1之间均匀分布。

    听到问题后有两个选择:

    • 放弃回答,拿走已得到的奖金
    • 回答问题:
      • 如果回答正确,奖金加倍
      • 如果回答错误,游戏结束,得不到奖金

    分析:

    d[i]表示答对i题后最大期望奖金,设回答对第i题的概率为p,

    则回答第i题的期望奖金 = p × d[i]

    考虑上不回答的情况,期望奖金最大值为max{2i-1, p*d[i]}

    因为p在t~1均匀分布,所以d[i]等于分段函数max{2i-1, p*d[i]}在这个区间上的积分。

    因为一段是常函数,一段是直线,所以积分很好求。

    令p0 = max{t, 2i/d[i+1]}

    • p < p0,选择不回答,奖金期望为2i
    • p ≥ p0,选择回答,奖金期望为(1+p0)/2 * d[i+1]

    根据全概率公式,第一种情况的概率为p1 = (p0 - t) / (1 - t)

    d[i] = p1*2i + (1-p1)*(1+p0)/2 * d[i+1]

    边界d[n] = 2n,答案为d[0]

     1 #include <cstdio>
     2 #include <algorithm>
     3 using namespace std;
     4 
     5 const int maxn = 35;
     6 double d[maxn];
     7 
     8 int main()
     9 {
    10     //freopen("in.txt", "r", stdin);
    11     int n;
    12     double t;
    13     while(scanf("%d%lf", &n, &t) == 2 && n)
    14     {
    15          d[n] = (1 << n);
    16          for(int i = n-1; i >= 0; --i)
    17          {
    18              double p0 = max(t, (double)(1<<i)/d[i+1]);
    19              double p1 = (p0-t)/(1-t);
    20              d[i] = (double)(1<<i)*p1 + (1+p0)/2 * d[i+1] * (1-p1);
    21          }
    22          printf("%.3f
    ", d[0]);
    23     }
    24 
    25     return 0;
    26 }
    代码君
  • 相关阅读:
    Web前端可以转行做游戏吗?
    SublimeText3常用快捷键和优秀插件(亲测)
    jQuery编程规范与最佳实践(附带一些个人的笔记)
    outline详解
    几种创建XMLHttpRequest对象的方法
    8条规则图解JavaScript原型链继承原理
    技术跟产品杂谈
    谈一谈URL
    React + Reflux 渲染性能优化原理
    Interesting JavaScript
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4189098.html
Copyright © 2020-2023  润新知