uva 10900 So you want to be a 2n-aire?

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uva 10900 So you want to be a 2n-aire?相关的知识,希望对你有一定的参考价值。

https://vjudge.net/problem/UVA-10900

     在一个电视娱乐节目中,你一开始有1元钱。主持人会问你n个问题,每次你听到问题后有两个选择:一是放弃回答该问题,退出游戏,拿走奖金;二是回答问题。如果回答正确,奖金加倍;如果回答错误,游戏结束,你一分钱也拿不到。如果正确地回答完所有n个问题,你将拿走所有的2 n 元钱,成为2 n 元富翁。当然,回答问题是有风险的。每次听到问题后,你可以立刻估计出答对的概率。由于主持人会随机问问题,你可以认为每个问题的答对概率在t和1之间均匀分布。输入整数n和实数t(1≤n≤30,0≤t≤1),你的任务是求出在最优策略下,拿走的奖金金额的期望值。这里的最优策略是指让奖金的期望值尽量大。

 

最优策略,说明一定只答对题

dp[i]表示答对i道题,获得奖金的期望最大值

假设当前已经答对了i道题,得到了2^i元

如果 p*dp[i+1]>2^i,那么他一定会选择答题

所以首先算出这个分界p

如果t>=p, 那就答题,dp[i]=(1+t)/2 * dp[i+1]

否则,分(t——p,停止答题)和(p——1继续答题)讨论

∴dp[i]=(p-t)/(1-t)*2^i + (1-p)/(1-t)*(1+p)/2*dp[i+1]

(1+t)/2、(1+p)/2 :答对的概率均匀分布,取平均值

 

#include<cstdio>
using namespace std;
double dp[31],p;
int bit[31];
int main()
{
    bit[0]=1;
    for(int i=1;i<=30;i++) bit[i]=bit[i-1]*2;
    int n;double t;
    while(scanf("%d",&n)!=EOF)
    {
        if(!n) return 0;
        scanf("%lf",&t);
        dp[n]=bit[n];
        for(int i=n-1;i>=0;i--)
        {
            p=bit[i]/dp[i+1];
            if(t>=p) dp[i]=(1+t)/2*dp[i+1];
            else dp[i]=(p-t)/(1-t)*bit[i]+(1-p)/(1-t)*(1+p)/2*dp[i+1];
        }
        printf("%.3lf\n",dp[0]);
    }
}

 

以上是关于uva 10900 So you want to be a 2n-aire?的主要内容,如果未能解决你的问题,请参考以下文章

So you want to be a 2n-aire? UVA - 10900(概率)

How to Get What You Want 如何得到你想要的

If you want to allow applications containing errors to be published on the server

Lombok Requires Annotation Processing: Do you want to enable annotation processors?

[python]spyder无法启动并提示Spyder is already running. If you want to open a new instance, please pass to i

ubuntu安装包提示错误you might want to run ‘apt-get -f install‘ to correct these