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\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 }
【版权声明】
本博客版权归作者和博客园共有,作品来自于长沙.NET技术社区成员【吴俊毅】,有兴趣了解长沙.NET技术社区详情,请关注公众号【DotNET技术圈】