LightOj_1027 A Dangerous Maze

题目链接

题意:

  你在一个迷宫里, 开始的时候你面前有n个门, 选择每个门的概率相等, 有两种结果:

  1)回到|x|分钟之前(x为负时)

  2)x分钟之后出迷宫(x为正时)

  每次回到|x|分钟之前, 你都记不得你曾经选过哪扇门

  问走出迷宫所用时间的期望。

思路:

  因为每次都不记得曾经的选择, 所以每次的期望都是一样的。

  设,T1为每次走出去所用时间的期望, T2为回到之前所用时间的期望。

  则E = p * T1 + (T2 + E) * (1 - p)

  化简后得, p * E = p * T1 + T2 * (1 - p)

  假设有m个门是走出去的, 则p = m / n

  代进上式得:m * E / n = m * T1 / n + (n - m) * T2 / n

          m * E = m * T1 + (n - m) * T2

  T1 = (sigma x[i]) / m, x[i] > 0, T2 = (sigma |x[i]|) / (n - m), x[i] < 0 

  E = (sigma x[i] + sigma |x[i]|) / m

代码:

  

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <ctime>
 6 #include <set>
 7 #include <map>
 8 #include <list>
 9 #include <queue>
10 #include <string>
11 #include <vector>
12 #include <fstream>
13 #include <iterator>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define LL long long
18 #define MAXN 110
19 #define MOD 1000000007
20 #define eps 1e-6
21 int n;
22 int t[2], m;
23 int gcd(int a, int b)
24 {
25     return b == 0? a : gcd(b, a % b);
26 }
27 
28 int main()
29 {
30     int T;
31     int kcase = 0;
32     scanf("%d", &T);
33     while(T --)
34     {
35         scanf("%d", &n);
36         m = 0;
37         t[0] = t[1] = 0;
38         for(int i = 0; i < n; i ++)
39         {
40             int x;
41             scanf("%d", &x);
42             if(x > 0) 
43             {
44                 t[0] += x;
45                 m ++;
46             }
47             else 
48                 t[1] += (-1 * x);
49         }
50         if(!m) printf("Case %d: inf
", ++ kcase);
51         else
52         {
53             int k = gcd(t[0] + t[1], m);
54             printf("Case %d: %d/%d
", ++ kcase, (t[0] + t[1]) / k, m / k);
55         }
56     }
57     return 0;
58 }
View Code
原文地址:https://www.cnblogs.com/By-ruoyu/p/4713535.html