UVA - 557 Burger 排列组合 概率

来源:互联网 发布:网络电影后期制作合同 编辑:程序博客网 时间:2024/05/19 00:56

你题目大意:有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 100010double 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;}


0 0