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\n",1-p[n/2]); 40 } 41 return 0; 42 }