您的位置:首页 > 其它

UVA - 557 Burger 排列组合 概率

2015-01-13 14:37 99 查看
你题目大意:有N个孩子去吃汉堡,他们点了N个汉堡,N个汉堡中,其中N/2个是鸡腿堡,另外N/2个是牛肉堡。这N个孩子坐成了一个圈,然后抛硬币决定哪个孩子该得到哪种汉堡,每个孩子只能得一个汉堡,顺时针轮流抛硬币,正面就拿鸡腿堡,反面就拿牛肉堡,问最后两个孩子的汉堡是相同的概率

解题思路:如果直接枚举的话会很麻烦,因为有可能前面几个孩子就把其中一种汉堡全部取走了,剩下的孩子就没得选择了,只能拿另一种了,这样枚举的话比较难。那就考虑下用另一种方法,枚举最后两个小孩得到的汉堡是相同的所有情况,再用1减去这种情况就可以了。这样的话,前面的N-2个孩子有N-2个汉堡可以选择,而这N-2个汉堡中两种汉堡的种类各占一半,把其中的相同种类的汉堡分给这N-2个孩子,同种汉堡的数量2/N-1(因为已经各取出一个给最后两个孩子了),这种情况有C((N/2-1),(N-2))种,再乘上这种事件发生的概率2^(2-N),就可以得到最后两个孩子的汉堡是不相同的概率了。

即f(N) = 2^(2-N) * C((N/2-1),(N-2)),那么f(N-2) = 2^(N-4) * C((N/2-2),(N-4)),两式子相除,f(N) / f(N-2) = (N-3)/ (N-2),这样就可以递推出f(N)了

以上参考:www.cnblogs.com/staginner/archive/2011/12/13/2286151.html

#include<cstdio>
#define maxn 100010

double f[maxn];
void init() {
	f[2] = 1.0;
	for(int i = 4; i < maxn ; i += 2) 
		f[i] = f[i - 2] * (i - 3) / (i - 2);
}

int main() {
	init();
	int test, n;
	scanf("%d",&test);
	while(test--) {
		scanf("%d",&n);
		printf("%.4lf\n", 1 - f
);	
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: