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;
}

 

posted on 2013-07-12 15:48  夜->  阅读(188)  评论(0编辑  收藏  举报