lightoj 1104 Birthday Paradox

  题意:给定一个一年的天数,求最少多少人可以使至少两人生日同一天的概率不少于0.5。

  用二分去做。检验一个数是否符合时,刚开始实用普通的方法,直接计算,超时了~~,上网搜了一下代码,一位大神使用一个数组保存n!,因为阶乘的上升速度太快,100!就已经很大了,题目范围是到10W,直接保存肯定是要超啊~~,取对数就可以了。

  

#include<stdio.h>
#include<math.h>
#define maxn 100010

double s[maxn],t;
double fun(int num,int y)
{
    return s[y]-((s[y]-s[y-1])*num+s[y-num]);
}
int check(int num,int y)
{
    return fun(num,y)<=t;
}
int main()
{
    for(int i=1;i<maxn;i++) s[i]=s[i-1]+log(i*1.0);
    t=log(0.5);
    int T,n,cas=1;
    int ans;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int l=0,h=n,mid;
        while(h>l+1)
        {
            mid=(l+h)/2;
            if(check(mid,n))
                h=mid;
            else
                l=mid;
        }
        printf("Case %d: %d
",cas++,n==1?1:h-1);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yongren1zu/p/3249231.html