UVA10900 So you want to be a 2n-aire?
So you want to be a 2n-aire?
PDF
在一个电视娱乐节目中,你一开始有1元钱。主持人会问你n个问题,每次你听到问题后有两个选择:一是放弃回答该问题,退出游戏,拿走奖金;二是回答问题。如果回答正确,奖金加倍;如果回答错误,游戏结束,你一分钱也拿不到。如果正确地回答完所有n个问题,你将拿走所有的\(2^n\)元钱,成为\(2^n\)元富翁。当然,回答问题是有风险的。每次听到问题后,你可以立刻估计出答对的概率。由于主持人会随机问问题,你可以认为每个问题的答对概率在t和1之间均匀分布。输入整数n和实数t(1≤n≤30,0≤t≤1),你的任务是求出在最优策略下,拿走的奖金金额的期望值。这里的最优策略是指让奖金的期望值尽量大。
Staginner的题解
《训练指南》P335.
这个题目从一开始思路上就有问题,后来结合别人的解题报告来看,终于明白是怎么回事了,而且也突然发现,貌似我适合冒险但不适合赌博……
我们不妨设a[i]表示正确做完第i道题的收益的期望,显然我们最后要求的就是a[0]咯,但这个先放一放,我们先讨论一下在做第i+1个题目前我们是选择答题呢还是选择放弃呢。
首先,我们可以直观的想到,如果做完i题就退出的话,就可以得到2^i这么多钱。不妨假设答对第i+1个题的概率为p,那么我们自然会想到用p乘以“某个值”表示答题所获得的收益的期望,如果p乘以这个值大于2^i的话,我们肯定会选择答题咯,因为若是这样答题的话收益的期望是大于不答题的。那么现在问题就来了,这个“某个值”是什么呢?可能的最大值?可能的最小值?还是平均值(或者说是期望)?
如果做个比喻的话,选最大值的就是冒险狂,选最小值的就是胆小鬼,选平均值的就是接受过良好高等教育的ACMer,一开始我就成了冒险狂……
后来想想,也确实只有平均值在统计里面才比较有说服力,因此题目中所谓的plays the best strategy就是按我们上面所说的去决策每次究竟是答题还是不答题。上面我们只是对于p是固定值来讨论的,如果我们对p是任意的去讨论的话,显然不答题的平均收益是不变的,因为它和p没关系,仍是2^i,如果答题的话平均收益就应该是(ep+1)/2a[i+1],ep就是我们前面讨论的“分水岭”,用表达式写出来就是ep=2^i/a[i+1],当p>ep,那么pa[i+1]>2^i,也就是说如果答对这个题我就可以获得a[i+1]这么多钱,再乘答对的概率p就是答第i+1题的收益的期望,如果这个期望大于2^i,那么就会选择答题。当然题目中让算的是总收益,我们再各自乘以答题与否这些情况出现的概率即可,即a[i]=(ep-t)/(1-t)2^i+(t-ep)/(1-t)(ep+1)/2*a[i+1],这个式子值列出了ep>t的情况,对于ep<=t的情况,也可以类似写出表达式。
现在我们就发现了,计算a[i]是需要用到a[i+1]的,那我们怎么办?倒着算呗。那么a[N]是多少?显然是2^N,因为答对第N个题之后收益的期望自然就是最大的收益。
时间复杂度\(O(n)\)
#include<bits/stdc++.h>
#define il inline
#define co const
template<class T>T read(){
T data=0,w=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-') w=-w;
for(;isdigit(ch);ch=getchar()) data=data*10+ch-'0';
return data*w;
}
template<class T>il T read(T&x) {return x=read<T>();}
typedef long long LL;
co int N=35;
double d[N];
int main(){
int n;
double t;
while(scanf("%d%lf",&n,&t)==2&&n){
d[n]=1<<n;
for(int i=n-1;i>=0;--i){
double p0=(double)(1<<i)/d[i+1];
if(p0<t) p0=t;
double p1=(p0-t)/(1-t);
d[i]=(double)(1<<i)*p1+(1+p0)/2*d[i+1]*(1-p1);
}
printf("%.3lf\n",d[0]);
}
return 0;
}
UVA10900 So you want to be a 2n-aire?的更多相关文章
- 分治法求2n个数的中位数
问题:设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数.试设计一个O(logn)时间的分治算法,找出X和Y的2n个数的中位数 思想: 对于数组X[0:n-1]和Y[0:n ...
- 算法题----称硬币: 2n(并不要求n是2的幂次方)个硬币,有两个硬币重量为m+1, m-1, 其余都是m 分治 O(lgn)找出假币
Description: 有2n个硬币和一个天平,其中有一个质量是m+1, 另一个硬币质量为m-1, 其余的硬币质量都是m. 要求:O(lgn)时间找出两枚假币 注意: n不一定是2的幂次方 算法1: ...
- 给出2n+1个数,其中有2n个数出现过两次,如何用最简便的方法找出里面只出现了一次的那个数(转载)
有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数 例如这样一组数3,3,1,2,4,2,5,5,4,其中只有1出现了1次,其他都是出现了2次,如何找出其中的1? 最简便的方法是使用异或 ...
- 【2(2N+1)魔方阵 】
/* 2(2N+1)魔方阵 */ #include<stdio.h> #include<stdlib.h> #define N 6 #define SWAP(x, y) {in ...
- n皇后问题与2n皇后问题
n皇后问题 问题描述: 如何能够在 n×n 的棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后 (任两个皇后都不能处于同一条横行.纵行或斜线上) 结题思路: 可采用深度优先算法,将棋盘看成 ...
- 如何快速求解第一类斯特林数--nlog^2n + nlogn
目录 参考资料 前言 暴力 nlog^2n的做法 nlogn的做法 代码 参考资料 百度百科 斯特林数 学习笔记-by zhouzhendong 前言 首先是因为这道题,才去研究了这个玩意:[2019 ...
- [Swift]LeetCode961. 重复 N 次的元素 | N-Repeated Element in Size 2N Array
In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is repeate ...
- mysql扩展性架构实践N库到2N 库的扩容,2变4、4变8
mysql扩展性架构实践N库到2N 库的扩容,2变4.4变8 http://geek.csdn.net/news/detail/5207058同城 沈剑 http://www.99cankao.com ...
- 对八皇后的补充以及自己解决2n皇后问题代码
有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行./ ...
- 2n字符
有2n字符挨个排成一排,前n个是'1',后n个是'0'.如 11110000(此时2n=8),现在交换字符的位置,使之按照 10101010 的模式排列.而且要使字符移动的次数最少,编程计算最少的移动 ...
随机推荐
- [百家号]7nm ARM 64核!华为Hi1620高性能CPU公开:3.0GHz
7nm ARM 64核!华为Hi1620高性能CPU公开:3.0GHz https://baijiahao.baidu.com/s?id=1617735663824201180&wfr=spi ...
- 【转帖】Linux的NUMA机制
Linux的NUMA机制 http://www.litrin.net/2014/06/18/linux的numa机制/ NUMA(Non-Uniform Memory Access)字面直译为“非一致 ...
- 关于SQLSERVER登录不了的情况
是这样的,本人为了复制一个数据库文件把默认数据库设置成了脱机状态.在此点击联机的时候SSMS显示重启,重启后在用windows登录显示无法打开默认数据库.用其他不适该默认数据库的账号可以登录.想问一下 ...
- Kubernetes---Pod重启策略
PodSpec中有一个restartPolicy 字段,可能的值为Always.OnFailure和Never.默认为Always.restartPolicy 适用于Pod 中的所有容器.restar ...
- MyBatis使用小结
- Web应用中访问WEB-INF下的资源
WEB-INF目录是出于保护资源文件的目的,只能我们开发人员自己查看不可以通过URL直接访问的: 有时候我们也想直接访问WEB-INF中的资源,那就需要用到请求转发了(重定向redirect是不可以的 ...
- C++编写DLL文件
动态链接库DLL文件与EXE文件一样也是可执行文件,但是DLL也被称为库,因为里面封装了各种类.函数之类的东西,就像一个库一样,存着很多东西,主要是用来调用的.调用方式主要分为两种:隐式(通过lib文 ...
- 最大流Dinic(模板)
#define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...
- getContextPath、getServletPath、getRequestURI、getRealPath、getRequestURL、getPathInfo();的区别
<% out.println("getContextPath: "+request.getContextPath()+"<br/>"); ou ...
- C# 批量设置窗体中控件状态的方法
在开发中常遇到当点击某个按钮的时候,禁用文本框或按钮的的状态,以防止误操作,下面的代码是我已批量设置指定控件中的按钮状态的代码,同理可以延伸出很多操作. /// <summary> /// ...