UVa 557 汉堡

https://vjudge.net/problem/UVA-557

题意:

有n个牛肉堡和n个鸡肉堡给2n个孩子吃。每个孩子在吃之前都要抛硬币,正面吃牛肉堡,反面吃鸡肉堡。如果剩下的所有汉堡都一样,则不用抛硬币。求最后两个孩子迟到相同汉堡的概率。

思路:

我们可以先计算出最后两个孩子迟到不一样的汉堡的概率,这样之前的2n-2个孩子都需要抛硬币。

易得此时的概率为

因为有n-1个孩子吃同一种汉堡,所有一共有C(n-1,2n-2)种不同的选择方法,每种方法的概率都是(1/2)^(2n-2)。这也就是一个全概率公式。

最后得出一个递推公式,

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,int> pll;
15 const int INF = 0x3f3f3f3f;
16 const int maxn = 50000+5;
17 
18 double p[maxn];
19 
20 void init()
21 {
22     p[1]=1;
23     for(int i=1;i<=maxn;i++)
24     {
25         p[i+1]=(1-1./(2*i))*p[i];
26     }
27 }
28 
29 int main()
30 {
31     //freopen("in.txt","r",stdin);
32     int n;
33     int t;
34     scanf("%d",&t);
35     init();
36     while(t--)
37     {
38         scanf("%d",&n);
39         printf("%.4f
",1-p[n/2]);
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/zyb993963526/p/7086040.html