题意:有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
", ++c, t1 / q, t2 / q);
}
else
{
printf("Case %d: inf
", ++c);
}
}
return 0;
}