题意:有n扇门,有的门可以逃脱迷宫,有的门会绕回原点且不会保留记忆,问逃脱时间的数学期望,如果不能逃脱则输出"inf"
如果第一次选的就是可逃脱的门,其概率为1/n,其期望耗时为t/n,所以第一次选的是可逃脱们的耗时期望为sum(t)/n;
如果第一次选的是不可逃脱门,其概率为1/n,假设逃脱时间(题目所求)期望为E,则其逃脱时间为第一次未逃脱时间t加上期望的逃脱时间E,所以一个的耗时期望为(E+t)/n,记有cnt扇不可逃脱门,则第一次选择的是不可逃脱门的耗时期望为(sum(t)+cnt*E)/n;
所以题目所求时间期望E=sum(可逃脱门时间和)/n+(sum(不可逃脱门时间和)+cnt*E)/n,化简得E=(sum(所有门的时间和))/(n-cnt),n-cnt=可逃脱门数量,所以E=所有门时间和/可逃脱门数量。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N =5500;
int gcd(int a, int b) {
while (b != 0) {
int c = a % b;
a = b;
b = c;
}
return a;
}
int main() {
int t;
scanf("%d", &t);
for (int k = 1; k <= t; k++) {
bool flag = false;
int n;
scanf("%d", &n);
int sum1 = 0, sum2 = 0, cnt = 0;
for (int i = 1; i <= n; i++) {
int temp;
scanf("%d", &temp);
if (temp >= 0) {
flag = true;//判断能否逃脱,其实判断cnt(可逃脱门数量)是否为0即可
sum1 += temp;
cnt++;
}
else {
sum2 -= temp;
}
}
printf("Case %d: ", k);
if (!flag) {
printf("inf\n");
continue;
}
int gd = gcd(sum1 + sum2, cnt);//约分
int fz = sum1 + sum2;
fz /= gd;
int fm = cnt;
fm /= gd;
printf("%d/%d\n", fz, fm);
}
}