- 针对具体问题进行分类讨论,需要积分的可能通过分类和取平均值就对其进行了化简。
- 注意细节,比如当p0小于t的时候。
- 数学问题常用到递推,进阶的思想。
题解:
最大期望取决于概率,取max(2^i,p*d[i]),d[i]是回答第i个问题后的最大期望,分类求期望,然后根据边界d[n]递推回d[0]得到结果。
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
double t,v[33];
void pow()
{
v[0]=1;
for(int i=1;i<=30;i++)
v[i]=v[i-1]*2;
}
void solve()
{
double ans=v[n];
for(int i=n-1;i>=0;i--)
{
double p=v[i]/ans;//计算临界概率
if(p<=t)
ans=(1+t)/2.0*ans;//如果临界概率<=t,则选择继续答题,此时的答对概率为(1+t)/2,即取概率中间值
else
ans=v[i]*(p-t)/(1-t)+ans*((1+p)/2.0)*((1-p)/(1-t));
//如果临界概率>t,则在[t,p]内,不继续答题,此时得到的钱为v[i],但是处在这个区间内的概率为(p-t)/(1-t);
//在[p,1]内,答对概率为(1+p)/2,在这个区间的概率为(1-p)/(1-t);
}
printf("%.3lf\n",ans);
}
int main()
{
pow();
while(~scanf("%d%lf",&n,&t))
{
if(n==0&&t==0) break;
solve();
}
return 0;
}