[lightOJ 1027]A Dangerous Maze[期望]

时间:2021-02-13 08:12:23

题目链接:[lightOJ 1027]A Dangerous Maze[期望]
题意分析:
你的面前有n扇门,你选择每扇门的概率都是相同的,每个门都有自己的特性,正门会让你在Xi分钟后离开迷宫,负门会把你带回到Xi分钟前,如果被带回到过去,你就得行走Xi分钟,进而重新进行选择,能够选到正门视为成功走出迷宫。问:平均花费多少分钟能走出去?
解题思路:
计算期望啊,首先我们知道通向未来的门肯定能带我们出去,那么 1/n(x1+x2+....xp) 为正门走出去的期望分钟数,那么负数的呢?由于被传送回去,我们要花费xi分钟走回来重新选择,那么对于任意一扇负数门的期望为: 1/n(x+E) 。E为期望。最后求和,解一元方程即可。
个人感受:
看到期望人就方了= =。其实也还好。。。。不过还是费了一段时间理解TAT
具体代码如下:

#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<string>
#define ll long long
#define pr(x) cout << #x << " = " << (x) << '\n';
using namespace std;

int main()
{
    int t, n;
    for (int kase = scanf("%d", &t); kase <= t; ++kase) {
        scanf("%d", &n);
        int x, sum = 0, cnt = 0;
        for (int i = 0; i < n; ++i) {
            scanf("%d", &x);
            sum += abs(x);
            if (x < 0) ++cnt;
        }
        printf("Case %d: ", kase);
        if (cnt == n) {
            printf("inf\n");
            continue;
        }
        int gcd = __gcd(sum, n - cnt);
        printf("%d/%d\n", sum / gcd, (n - cnt) / gcd);
    }
    return 0;
}