lrj蓝书经典题。
可以先dp出来每个晚上输的概率,然后随便概率生成函数就可以算出来期望天数。
一个更简单的方法是解方程,设x为期望天数,p为没晚上输的概率,然后过程就如程序开头的备注了。
// x = p + (1-p)*(1+x) // x = p + 1+x-p-px // px = 1 => x = 1/p #include<bits/stdc++.h> #define ll long long using namespace std; #define D double const int N=105; const D eps=1e-7; int T,n,p[2]; D P,f[N],sum; char c; inline void solve(){ f[0]=1; for(int i=1;i<=n;i++) for(int j=floor(i*P+eps);j>=0;j--) f[j]=f[j-1]*P+f[j]*(1-P); for(int i=0;i<=n;i++) sum+=f[i]; } int main(){ scanf("%d",&T); for(int o=1;o<=T;o++){ scanf("%d%c%d%d",p,&c,p+1,&n),sum=0; fill(f,f+n+1,0),P=p[0]/(D)p[1]; solve(),printf("Case #%d: %d ",o,(int)floor(1/sum+eps)); } return 0; }