题目大概说你正在起点,面前有$n$个门,每个门有一个数字$x$,正数表示开这个门$x$分钟后会出去,负数表示开这个门$-x$分钟后会回到起点。选择门的概率是一样的且每次选择互不影响。问出去的时间期望是多少。
$d[0]$表示从起点出发出去的期望,$d[i](1leqslant ileqslant n)$表示选择第i个门出去的期望;
不妨设$1dots j$的门是正数,$j+1dots n$的门是负数,那么:
$$d[i]=x[i](1leqslant ileqslant j)$$
$$d[i]=x[i]+d[0](j+1leqslant ileqslant n)$$
由于每个门被选择的概率均等,那么:
$$d[0]=frac{sum_{i=1}^{j}x[i]+sum_{i=j+1}^{n}(x[i]+d[0])}{n}$$
$$d[0]=frac{sum_{i=1}^{n}x[i]}{n-j}$$
这样计算出$d[0]$就是要的结果了。队友教的。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int gcd(int a,int b){ 5 if(b==0) return a; 6 return gcd(b,a%b); 7 } 8 int main(){ 9 int t,n,a; 10 scanf("%d",&t); 11 for(int cse=1; cse<=t; ++cse){ 12 scanf("%d",&n); 13 int tot=0,cnt=0; 14 for(int i=1; i<=n; ++i){ 15 scanf("%d",&a); 16 if(a<0) tot-=a,++cnt; 17 else tot+=a; 18 } 19 int x=tot,y=n-cnt; 20 if(y==0) printf("Case %d: inf ",cse); 21 else printf("Case %d: %d/%d ",cse,x/gcd(x,y),y/gcd(x,y)); 22 } 23 return 0; 24 }