在写这个题的时候没什么思路,参考了一下网上的题解,地址:http://www.cnblogs.com/staginner/archive/2011/12/13/2286691.html
原作者写的挺详细了,起初看的时候对a[i]这个数组的含义不是很清楚-后来想了想,明白了a[i]是在“答对i道题目后所得财富的期望”,也就是说,这个a[i]是包涵两部分的,一个是答了i道题后放弃答题,拿走2^i,另一个是继续向下答x道题目。明白了这个之后,递推式也就出来了。计算的时候用到了均匀分布的知识,刚巧这学期学完概率论,还有点印象......
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <memory.h>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <map>
using namespace std;
double q[35];
double t;
int n,m;
void slove()
{
int i,j,k;
double eq,f=1,quit;
f=q[n];
for (int i=n-1; i>=0; i--)
{
quit=q[i];
eq=quit/f;
if (eq<=t)
{
f=(t+1)/2*f;
}
else
{
f=(eq-t)/(1-t)*quit+(1-eq)/(1-t)*(eq+1)/2*f;
}
}
printf("%.3lf\n",f);
}
int main()
{
q[0]=1;
for (int i=1; i<=31; i++)
q[i]=q[i-1]*2;
while (~scanf("%d%lf",&n,&t))
{
if (!n) break;
if (fabs(1-t)<0.000000001) printf("%.3lf\n",q[n]);
else
slove();
}
return 0;
}