• 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
  • 相关阅读:
    从Delegate.CreateDelegate看值类型的实例方法
    c#编译器如何处理匿名委托
    线程静态的几个特点
    Framework 3.5学习笔记
    看看给我用的基类,还有多少人愿意做下去
    .net里面数组的复制
    装饰模式与大接口的装饰模式的思考
    SingleTon的实现与性能
    特性与方法注入
    CLR与浮点数
  • 原文地址:https://www.cnblogs.com/By-ruoyu/p/4713535.html
Copyright © 2020-2023  润新知