zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    GUI编程
    网络编程
    线程池详解_3
    多线程详解_2
    注解和反射_1
    多线程详解_1
    javaEE简要总结
    MarkDown使用教程简单介绍
    com.sun.xxx.utils不存在问题的解决
    解决npm install安装慢的问题
  • 原文地址:https://www.cnblogs.com/yongren1zu/p/3249231.html
Copyright © 2011-2022 走看看