注解
1、初始值为1,如果答一个题后平均能达到的金额大于不答此题手里的金额,就应该答,否则就不应该答。
2、每答对1题翻倍,因此答n个题后全对应该是2的n次方。
3、求答与不答的概率边界,也就是bestMoney[i]/expected[i+1];,其实也就是0.5
4、答题概率是[t,1],如果t>0.5,显然应该答。答的概率是[t,1]之间的数,取期望,也就是(t+1)/2。而如果t<0.5,在[t,0.5]之间时应该不答,在[0.5,1]之间时应该答。因此期望是(0.5-t)/(1-t)*不答+0.5/(1-t)*答,不答的话,手里的金额就是bestmoney[i](因为i表示第一个不答的题),答的话,就是expected[i+1]乘上答的概率:(1+0.5) / 2
5、应该从后往前倒着求,也就是从n-1到0,最后输出的是expected[0]。
代码
#include <iostream>
using namespace std;
const int MAXN = 32;
double expected[MAXN];
double bestMoney[MAXN];
int n;
double t;
void prework(){
bestMoney[0] = 1;
for(int i=1; i<MAXN; i++){
bestMoney[i] = bestMoney[i-1] * 2;
}
}
void mainwork(){
expected[n] = bestMoney[n];
for(int i=n-1; i>=0; i--){
double boundary = bestMoney[i]/expected[i+1];
if(boundary<=t){
expected[i] = (1.0+t)/2 * expected[i+1];
}
else{
expected[i] = (boundary-t)/(1.0-t) * bestMoney[i] + (1-boundary)/(1-t) * (1+boundary)/2.0 * expected[i+1];
}
}
}
void print(){
printf("%.3lf\n", expected[0]);
}
int main() {
prework();
cin>>n>>t;
while(n || t){
mainwork();
print();
cin>>n>>t;
}
return 0;
}