`
阿尔萨斯
  • 浏览: 4192752 次
社区版块
存档分类
最新评论

hdu 4586 Play the Dice(数论)

 
阅读更多

题目链接:hdu 4586 Play the Dice


题目大意:给出一个n,表示有一个正n面形,然后给出每个面的得分。接着是m,表示丢到哪些面后可以获得再掷一次的机会,问说得分的期望。


解题思路:将首次的得分期望看做是a0, 第二次的得分期望即为a0 * (m/n), 第n次的得分期望即为a0 *(m/n)^(n-1),

期望p = ∑(n)a0 * q^(i-1), q = (m/n); 根据等比数列求和公式得:p = a0(1-q^n)/(1-q).


然后分情况讨论,如果q为1的话,那么根据(1-q)=0,公式无法计算,但是根据题目可以知道,q为1的话表示不管丢到哪一面都能继续下去,根本停不下来,所以如果a0不为0的话,答案应该是inf(题目要求),如果为0,即输出0。


如果q<1的话,当n趋近与无穷大时,q^n趋近于0,p = a0/(1-q).


#include <stdio.h>
#include <string.h>
#include <math.h>
const double INF = ((1<<31)-1);
const double eps = 1e-6;
const int N = 205;

int n, m;
double p, q;

void init () {
	int sum, cnt, a, v[N];
	sum = cnt = 0;
	memset(v, 0, sizeof(v));

	for (int i = 0; i < n; i++) {
		scanf("%d", &a);
		sum += a;
	}

	scanf("%d", &m);
	for (int i = 0; i < m; i++) {
		scanf("%d", &a);
		if (v[a]) continue;
		v[a] = 1;
		cnt++;
	}

	p = sum * 1.0 / n;
	q = cnt * 1.0 / n;
}

int main () {
	while (scanf("%d", &n) == 1) {
		init ();
		if (fabs(q - 1) < eps) {
			if (fabs(p) > eps)
				printf("inf\n");	
			else
				printf("0.00\n");
		} else
			printf("%.2lf\n", p/(1-q));
	}
	return 0;
}





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics