lightoj1027(数学期望与概率)

题意:

你在一个迷宫里,面前有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);
	}
}	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值