相同生日概率(经典问题)

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/F

题意:

       多组案例。每组案例给出一年的天数(不一定是地球一年365天,火星上一年有669天),问开展的生日party上需要有多少人才能满足至少两人生日相同的几率达到至少0.5。

案例:

       Sample Input

       2

       365

       669

       Sample Output

       Case 1: 22

       Case 2: 30

分析:

       题目应从当前事件的对立事件入手,这样可以简化题目。也就是说现在要求至少需要多少人能满足任意两人的生日不同的概率低于0.5。怎样求取概率呢?举个例子:一年365天,假设有5个人,若要任意两人生日不同,则假定第一个人已经确定为某一天,那么第二个人有364种选法,第三个人有363种选法,第四个人有362种选法,第五个人有361种选法这样才可以保证要求。而原本每个人都有365种选法,这样任意两人生日不同概率为(364*363*362*361)/(365*365*365*365)。注意不要累计分子分母最后求积,这样会造成数据溢出。

源代码:

 1 #include<cstdio>
 2 int n,ans,a[100005];
 3 void birth()
 4 {
 5         ans=2;
 6         double k=n-1;
 7         double p=1;
 8         while(1)
 9         {
10              p*=double(k/n);
11              if(p<=0.5) break;//对立事件概率
12              k-=1;
13              ++ans;
14         }
15 }
16 int main()
17 {
18     int T,cnt=0;
19     scanf("%d",&T);
20     while(T--)
21     {
22         scanf("%d",&n);
23         birth();
24         printf("Case %d: %d\n",++cnt,ans-1);
25     }
26     return 0;
27 }

 

posted @ 2015-08-20 19:47  ~瞬间*  阅读(1694)  评论(0编辑  收藏  举报