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