题意:
你在一个迷宫里,面前有n扇们,每个门有一个数字k;
如果k为正数,则通过这扇门,走k分钟就能出去,
如果为负数,则通过这扇门走-k的分钟回到迷宫;
走每扇门概率一样.问走出迷宫所需时间的期望值;
思路:
首先如果全是负数肯定是inf;
然后我们假设我们走出去的期望时间是d;
那么拿第三个样例举例子; d = 1/3 * 3 + 1/3( 6 + d) + 1/3 (9 + d);
意思就是每扇门被选择的概率是1/3;选选第一扇门要花3分钟出去,选第二扇门要6 + d(花6分钟返回原地,在花期望d出去);
然后根据这个式子求出d;并用分数表示;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct frac{
int u;
int d;
}f;
frac add(frac a, frac b) {
if(a.d == 0)
return b;
frac tmp;
int up = a.u * b.d + a.d * b.u;
int down = a.d * b.d;
int c = __gcd(up, down);
tmp.u = up / c;
tmp.d = down / c;
return tmp;
}
int main() {
int t, n;
int cas = 1;
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
int d = 0;
frac num;
num.u = 0;
num.d = 0;
int tmp;
for(int i = 0; i < n; i++) {
scanf("%d",&tmp);
if(tmp > 0) {
f.u = tmp;
f.d = n;
num = add(num, f);
}else {
f.u = -tmp;
f.d = n;
num = add(num, f);
d++;
}
}
if(d == n) {
printf("Case %d: inf\n",cas++);
continue;
}
num.u *= n;
num.d *= (n - d);
int c = __gcd(num.u, num.d);
printf("Case %d: %d/%d\n",cas++, num.u / c, num.d / c);
}
}