题意:给定一个一年的天数,求最少多少人可以使至少两人生日同一天的概率不少于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; }