题意:有n扇门,一扇门可以从迷宫中出去,也可以返回到原点,求从迷宫中出去的预期时间。

分析:求从迷宫中出去的期望(加权平均值)
\(一次性从迷宫中出去的概率p1 = \frac{正的个数}{所有门的个数n},时间T1 = \frac{\sum x正}{正门的个数},期望为p1 * T1\)
\(回到原点的概率p2 = \frac{负的个数}{所有门的个数n},时间T2 = \frac{\sum x负}{负门的个数},回到原点再出去的期望为p2 * (T2 + E)\)

总的期望为\(E = p1 * T1 + p2 * (T2 + E)\),求解得出这个期望\(E = \frac{p1 * T1 + p2 * T2}{1 - p2}\)
\(E = \frac{\sum x正 + \sum x负}{正门的个数}\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;
const int N = 105;
int door[N];
int gcd(int a, int b)
{
    return b ? gcd(b, a % b) :a;
}
int main()
{
    int t;
    scanf("%d", &t);

    int c = 0;
    while(t--)
    {
        int n;
        scanf("%d", &n);
        //每个门的时间
        for(int i = 1; i <= n; ++i) scanf("%d", &door[i]);

        //出去的门的时间,回来的门的时间
        int a = 0, b = 0;
        //出去的门的个数
        int tot = 0;
        bool flag = false;
        for(int i = 1; i <= n; ++i)
        {
            if(door[i] > 0)
            {
                flag = true;
                a += door[i];
                ++tot;
            }
            else
            {
                b += abs(door[i]);
            }
        }

        int t1 = a + b;
        int t2 = tot;

        //化简
        int q = gcd(t1, t2);

        if(flag)
        {
            printf("Case %d: %d/%d\n", ++c, t1 / q, t2 / q);
        }
        else
        {
            printf("Case %d: inf\n", ++c);
        }
    }
    return 0;
}