UVa 11427 - Expect the Expected

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2422

每一天的情况是相互独立的

d[i][j] 表示这一天比了i次赢了j次还不能回去的概率

这样就可以 求出比了n次 仍然不能回去(垂头丧气回去,以后再也不玩了)的概率 Q

然后可以经过推导 最终期望为 1/Q

代码:

#include<iostream>

#include<cstdio>

#include<string>

#include<cstring>

#include<cmath>

#include<set>

#include<map>

#include<stack>

#include<vector>

#include<algorithm>

#include<queue>



#define ull unsigned long long

#define ll long long

#define lint long long

using namespace std;



const int INF=0x3f3f3f3f;

const int N=1003;

double d[N][N];



int main()

{

    //freopen("data.in","r",stdin);

    int T;

    scanf("%d",&T);

    for(int c=1;c<=T;++c)

    {

        printf("Case #%d: ",c);

        int n;

        int a,b;

        double p;

        scanf("%d/%d %d",&a,&b,&n);

        p=1.0*a/b;

        //cout<<a<<" "<<b<<" "<<n<<" "<<p<<endl;

        for(int i=0;i<=n;++i)

        for(int j=0;j<=n;++j)

        d[i][j]=0.0;

        d[0][0]=1.0;

        for(int i=1;i<=n;++i)

        for(int j=0;j<=i;++j)

        {

            if(1.0*j/i<=p)

            {

                d[i][j]+=d[i-1][j]*(1-p);

                if(j-1>=0)

                d[i][j]+=d[i-1][j-1]*(p);

            }

        }

        double sum=0.0;

        for(int j=0;j<=n;++j)

        {

            sum+=d[n][j];

        }//cout<<sum<<endl;

        printf("%d\n",(int)(1.0/sum));

    }

    return 0;

}

 

你可能感兴趣的:(expect)