首先看一个问题,当p为定值时,
则以d[ i ] 表示已经答对 i 题,后的最大期望值 d[ i ] = max(2^i , d[ i+1 ] * p);
则改题目结果为 d[ i ] 在 t - 1 上积分,由于其为均匀分布,积分很好积,还有一个问题 第一开始认为 p 的期望为 (1+t)/2; 直接用该值计算了,但其与上述积分式并不等价
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
long long c[41];
double d[45];
int main()
{
c[0]=1;
for(int i=1;i<=40;i++) c[i]=c[i-1]*2;
double t,p0;
int n;
while(scanf("%d %lf",&n,&t)==2){
if(!n) break;
d[n]=c[n];
for(int i=n-1;i>=0;i--){
double p0 = max(t,c[i]/d[i+1]);
double p1 = (p0-t)/(1-t);
d[i]=p1*c[i]+(1.0 - p1)*(p0+1)/2.0*d[i+1];
}
printf("%.3lf\n",d[0]);
}
return 0;
}