题意:n扇门,每扇所花时间为abs(x[i]),若x[i]为负则无法走出,为正则走出迷宫。求走出迷宫的期望时间。
思路:设cnt为x为正的门数。则一次走出迷宫的概率为 cnt / n,走出迷宫的期望次数为 n / cnt。走一次的平均时间为sum(abs[x[i]]) / n。则期望时间 ans = sum / n * n / cnt = sum / cnt。
#include <algorithm> #include <iostream> #include <sstream> #include <cstring> #include <cstdio> #include <vector> #include <string> #include <queue> #include <stack> #include <cmath> #include <set> #include <map> using namespace std; typedef long long LL; #define mem(a, n) memset(a, n, sizeof(a)) #define ALL(v) v.begin(), v.end() #define si(a) scanf("%d", &a) #define sii(a, b) scanf("%d%d", &a, &b) #define siii(a, b, c) scanf("%d%d%d", &a, &b, &c) #define pb push_back #define eps 1e-8 const int inf = 0x3f3f3f3f, N = 1e2 + 5, MOD = 1e9 + 7; int T, cas = 0; int n, m; int main(){ #ifdef LOCAL freopen("/Users/apple/input.txt", "r", stdin); // freopen("/Users/apple/out.txt", "w", stdout); #endif si(T); while(T --) { si(n); int cnt = 0, ans = 0; for(int i = 1; i <= n; i ++) { si(m); ans += abs(m); if(m > 0) cnt ++; } printf("Case %d: ", ++ cas); if(!cnt) { puts("inf"); continue; } printf("%d/%d\n", ans / __gcd(ans, cnt), cnt / __gcd(ans, cnt)); } return 0; }