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

题目链接: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 }

 

转载于:https://www.cnblogs.com/huaszjh/p/4741677.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值