https://cn.vjudge.net/problem/LightOJ-1027
题意:
有n扇门,每扇门有个时间ti,选择正数的门可以在ti后带你走出迷宫,负数的门会在ti后带你回到起点,然后重新选择,每扇门被选中的概率是一样的,求期望。
思路:
做这种期望的问题必须得列一个方程来求解,不然无限写下去的话算不出。
设走出去的期望的E,对于第三个案例就是 E = 1/3 * 3 + 1/3( 6 + E) + 1/3 (9 + E),(选择第一扇门就直接出去,第二扇门先6分钟回去,然后再花期望E,第三扇门同理..)
因为这里每扇门的概率都是一样的,所以对于上式,我们是可以进行合并的,sum1表示正数门时间之和,sum2表示复数门时间之和,cnt1表示正数门数量,cnt2表示负数门数量。
于是,我们可以得到
E=1/n*sum1+1/n*(sum2+cnt2*E)
化简得:
E = (sum1 + sum2) / (n-cnt2)。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<sstream> 6 #include<vector> 7 #include<stack> 8 #include<queue> 9 #include<cmath> 10 #include<map> 11 #include<set> 12 using namespace std; 13 typedef long long ll; 14 typedef pair<int,int> pll; 15 const int INF = 0x3f3f3f3f; 16 const int maxn = 100 + 5; 17 18 int n; 19 20 int door[maxn]; 21 22 int gcd(int a,int b) 23 { 24 return b==0?a:(gcd(b,a%b)); 25 } 26 27 int main() 28 { 29 //freopen("in.txt","r",stdin); 30 int T; 31 int kase=0; 32 scanf("%d",&T); 33 while(T--) 34 { 35 printf("Case %d: ",++kase); 36 scanf("%d",&n); 37 for(int i=1;i<=n;i++) scanf("%d",&door[i]); 38 39 int sum1=0,sum2=0; 40 int cnt1=0,cnt2=0; 41 for(int i=1;i<=n;i++) 42 { 43 if(door[i]>0) {cnt1++;sum1+=door[i];} 44 else {cnt2++;sum2+=abs(door[i]);} 45 } 46 47 if(cnt1==0) {printf("inf ");continue;} 48 int g=gcd(sum1+sum2,n-cnt2); 49 printf("%d/%d ",(sum1+sum2)/g,(n-cnt2)/g); 50 } 51 return 0; 52 }