uva 10900 - So you want to be a 2n-aire?(期望)

202 篇文章 0 订阅
179 篇文章 0 订阅

题目链接;uva 10900 - So you want to be a 2n-aire?


题目大意:一个答题赢奖金的问题,玩家初始的金额为1,给出n,表示有n道题目,t表示说答对一道题目的概率在t到1之间,每次面对一道题,可以选择结束游戏,获得当前奖金;回答下一道问题,答对的概率p在t到1之间,答对的话奖金翻倍,答错的话结束游戏,没有奖金,求玩家赢的奖金的期望值的最大值。


解题思路:这题的概率是个大坑点啊,因为给的是范围,所以纠结了好久,没做过这种题,看了别人的题解才知道可以用平均值.....假设玩家已经答对了i题,那么他当前的奖金应该是2^i,若答对i+1道题的概率为p, 如果p * ans(下一题的最优期望)>2^i,则说明他一定会选择答题,所以可以先求一下临界概率f = 2 * i/ ans,如果f < t的话,说明无论p为何值(因为p在t~1)都满足p * ans >2 ^i,所以一定回答下一题(这是p去t和1的平均值),如果f>t的话,就要分两种情况讨论,即p在(t~f)的时候,和(f~1),注意两种情况的概率也不相同。


#include <stdio.h>
#include <string.h>
#include <math.h>
const int N = 35;

int n;
double v[N], t;

double solve() {
	if (fabs(1 - t) < 1e-9) return v[n];

	double ans = v[n];
	for (int i = n - 1; i >= 0; i--) {
		double f = v[i] / ans;

		if (f <= t)
			ans  = (1 + t) / 2 * ans;
		else
			ans = (f - t) / (1 - t) * v[i] + (1 - f) / (1 - t) * (1 + f) / 2 * ans;
	}
	return ans;
}

int main () {
	v[0] = 1;
	for (int i = 1; i <= 30; i++)
		v[i] = v[i - 1] * 2;

	while (scanf("%d%lf", &n, &t), n && t) {
		printf("%.3lf\n", solve());
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值