【数学+概率+期望】HDU-1145 So you want to be a 2n-aire?

在这里插入图片描述
在这里插入图片描述

注解

1、初始值为1,如果答一个题后平均能达到的金额大于不答此题手里的金额,就应该答,否则就不应该答。
2、每答对1题翻倍,因此答n个题后全对应该是2的n次方。
3、求答与不答的概率边界,也就是bestMoney[i]/expected[i+1];,其实也就是0.5
4、答题概率是[t,1],如果t>0.5,显然应该答。答的概率是[t,1]之间的数,取期望,也就是(t+1)/2。而如果t<0.5,在[t,0.5]之间时应该不答,在[0.5,1]之间时应该答。因此期望是(0.5-t)/(1-t)*不答+0.5/(1-t)*答,不答的话,手里的金额就是bestmoney[i](因为i表示第一个不答的题),答的话,就是expected[i+1]乘上答的概率:(1+0.5) / 2
5、应该从后往前倒着求,也就是从n-1到0,最后输出的是expected[0]。

代码

#include <iostream>

using namespace std;

const int MAXN = 32;

double expected[MAXN];
double bestMoney[MAXN];
int n;
double t;

void prework(){
    bestMoney[0] = 1;
    for(int i=1; i<MAXN; i++){
        bestMoney[i] = bestMoney[i-1] * 2;
    }
}

void mainwork(){
    expected[n] = bestMoney[n];
    for(int i=n-1; i>=0; i--){
        double boundary = bestMoney[i]/expected[i+1];
        if(boundary<=t){
            expected[i] = (1.0+t)/2 * expected[i+1];
        }
        else{
            expected[i] = (boundary-t)/(1.0-t) * bestMoney[i] + (1-boundary)/(1-t) * (1+boundary)/2.0 * expected[i+1];
        }
    }
}

void print(){
    printf("%.3lf\n", expected[0]);
}

int main() {
    
    prework();
     
    cin>>n>>t;
    while(n || t){
        mainwork();
        print();
        cin>>n>>t;
    }

    return 0;
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值