题意:
你在一个迷宫里, 开始的时候你面前有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\n", ++ kcase);
51 else
52 {
53 int k = gcd(t[0] + t[1], m);
54 printf("Case %d: %d/%d\n", ++ kcase, (t[0] + t[1]) / k, m / k);
55 }
56 }
57 return 0;
58 }