UVA - 557 Burger 排列组合 概率

你题目大意:有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[n]);	
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值