题目链接:LightOJ - 1027

Description

Input

Output

Sample Input

3

1
1

2
-10 -3

3
3 -6 -9

Sample Output

Case 1: 1/1
Case 2: inf
Case 3: 18/1

Solution

题意

你在一个迷宫里,面前有 \(n\) 扇门,如果第 \(i\) 扇门的 \(X_i\) 值为正值,就可以花费 \(X_i\) 的时间的走出迷宫,否则花费 \(abs(X_i)\) 的时间又回到原点,且不记得之前走过哪些门。每次等概率选择一扇门,问走出迷宫的时间的期望。不能走出去输出 \(inf\)

思路

设有 \(n_1\) 扇门能走出迷宫,\(n_2\) 不能走出迷宫,则 \(n_1 + n_2 = n\)

\(n_1\) 扇门的 \(X_i\) 值的平均值为 \(t_1\)\(n_2\) 扇门的 \(X_i\) 值的平均值为 \(t_2\).

设走出去的期望为 \(E\)。则 \(E = \frac{n_1}{n} \cdot t_1 + \frac{n_2}{n} \cdot (t_2 + E)\)

化简后为 \(E = \frac{1}{n_1}\sum_{i=1}^n abs(X_i)\)

Code

#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;

int x[maxn];

int gcd(int a, int b) {
    return a == 0? b: gcd(b % a, a);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    int kase = 0;
    while(T--) {
        int n;
        cin >> n;
        int sum = 0;
        int cnt = 0;
        for(int i = 1; i <= n; ++i) {
            cin >> x[i];
            if(x[i] > 0) {
                ++cnt;
                sum += x[i];
            } else {
                sum += -x[i];
            }
        }
        int d = gcd(sum, cnt);
        if(cnt == 0) printf("Case %d: inf\n", ++kase);
        else printf("Case %d: %d/%d\n", ++kase, sum / d, cnt / d);
    }
    return 0;
}
02-10 02:41