杭電1145 so you want to be a 2n-aire?

杭電1145
          這道題的意思是給你一元錢,讓你連續回答n個問題,每回答對一個問題,錢數翻倍,回答錯了,就什麼也沒有了,已知你回答對沒到題的概率在t到1之間均勻分佈。求你能獲得的最大的錢數期望。
      剛看到這道題不明白什麼意思,到底求什麼期望,後來看了幾篇大牛的博客才懂,首先假設有n道題,你已經回答了i道題了,下面我們要確定的是回答第i+1道題是回答還是不回答,那麼該如何確定呢?
     你已經回答了i道題,那麼獲得的錢是2^i,我們假設回答問題所獲的期望存儲在數組d中,那麼回答對第i+1 道題的期望就是d[i+1],我們假設一個比值ep,來確定要不要回答第i+1道題,如果d[i+1]*ep>2^i,回答後期望得到的錢比不回答的錢多,那麼肯定要回答。即當ep>2^i/d[i+1];肯定回答下一題。那麼我們就假定ep=2^i/d[i+1]爲臨界值。那麼我們就要確定ep與t的大小了。
                         很明顯,當t>=ep時,即回答對下一題的概率大於回答下一題的概率,那麼肯定回答下一題。這樣回答下一題的期望就是(1+t)/2*2*d[i+1](因爲t是均勻分佈,所以t的數學期望是(1+t)/2);
                        那麼當t<ep時,我們要不要回答這題呢,不知道,我們要判斷概率,回答這道的概率是(1-ep)/(1-t);那麼不回答這題的概率應該就是(ep-t)/(1-t);(根據所謂的全概率公式,雖然剛學概率論,居然不會用概率論公式,難怪這題卡那麼久)或許會疑惑爲什回答的概率是1和(1-ep)/(1-t)不一樣呢,實際上都是(1-max(t,ep))/(1-t);只有概率大於ep是纔會回答
                      那麼我們該如和確定期望呢,不回答第i+1道題的話,錢肯定是2^i,回答的話可以獲得(1+ep)/2*d[i+1],因爲ep<p<1(p爲回答概率的可能值)。那麼我們就得到了t<ep時的公式(1-ep)/(1-t)*(1+ep)/2*d[i+1]+(ep-t)/(1-t)*2^i.
          那麼我們要求怎麼選擇回答問題能獲得的最大期望,很明顯根據公式我們要你推,首先我們知道回答n道題的期望是2^n,那麼我們逆推確定要不要回答第n道,如果不確定的話,我們在確定要不要回答第n-1道題的期望,和第n道的期望比較,我們根據後面的預判期望進行比較,判斷是否答題,所以最終得到最優判定在a[0]中,相當於從後往前進行答題
ac代碼

#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main()
{
    double a[40];
int  n;
double p;
    while(cin>>n>>p)
    {
        if(n==0&&p==0)
        {
            break;
        }
        a[n]=1<<n;
        for(int i=n-1;i>=0;i--)
        {
            double ep;
            ep=(1<<i)/(a[i+1]);
            if(ep<p)
            {
                a[i]=(1+p)/2*a[i+1];
            }
            else
            {
                a[i]=(ep-p)/(1-p)*(1<<i)+(1-ep)/(1-p)*(1+ep)/2*a[i+1];
            }
        }
    cout<<setiosflags(ios::fixed)<<setprecision(3)<<a[0]<<endl;;
    }
    return 0;
}



ps ep可以理解爲我們假定期望的能答對下一題的概率,與已知的概率進行比較,小於等於t就回答,大於就不確定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章