码迷,mamicode.com
首页 > 其他好文 > 详细

lightoj1027(数学期望与概率)

时间:2015-06-08 23:28:53      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

题意:

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


lightoj1027(数学期望与概率)

标签:

原文地址:http://blog.csdn.net/yeyeyeguoguo/article/details/46417489

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!