LightOJ 1027 A Dangerous Maze(期望)

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\n");continue;}
48         int g=gcd(sum1+sum2,n-cnt2);
49         printf("%d/%d\n",(sum1+sum2)/g,(n-cnt2)/g);
50     }
51     return 0;
52 }

 

posted @ 2017-07-24 10:24  Kayden_Cheung  阅读(136)  评论(0编辑  收藏  举报
//目录