【LightOJ-1104 Birthday Paradox】概率&期望DP

9 篇文章 0 订阅
8 篇文章 0 订阅

LightOJ-1104 Birthday Paradox

题意

经典的生日悖论问题,现在假设一年有n天,问一个生日聚会至少邀请多少人才能保证至少有两个人生日相同的概率不小于0.5

做法

首先我们通过样例大胆猜对于每个n,答案应该很小。之后我们用dp的方法求即可。
dp[i]表示到i个人出现两个人生日相同的概率,首先1-dp[i-1]表示i-1个人没出现两个人生日相同的概率,之后只要第i个人生日和i-1个人中的某一个相同即可,又因为i-1个人的生日两两不同,所以第i个人与i-1个人中的某一个生日相同的概率为 i − 1 n \frac{i-1}{n} ni1,于是可以得到转移式:

d p [ i ] = ( 1 − d p [ i − 1 ] ) ∗ i − 1 n + d p [ i − 1 ] dp[i]=(1-dp[i-1])*\frac{i-1}{n}+dp[i-1] dp[i]=(1dp[i1])ni1+dp[i1]

最后当dp[i]大于等于0.5跳出即可,注意题目中邀请的人不算自己,所以要减去1输出。

代码


#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const double eps = 1e-8;
int sgn(double x)
{
    if(fabs(x)<eps) return 0;
    if(x<0) return -1;
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    int cas=0;
    while(t--)
    {
        int n;
        int ans=1;
        scanf("%d",&n);
        double tmp=0;
        double cc=0;
        for(int i=2;;i++)
        {
            tmp=(1.0-cc)*(1.0*(i-1)/n);
            cc=cc+tmp;
            if(sgn(cc-0.5)>=0)
            {
                ans=i;
                break;
            }
        }
        printf("Case %d: %d\n",++cas,ans-1);
    }
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值