ZOJ3665Yukari's Birthday【二分】
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4888
题目大意:给你n根蜡烛,一圈一圈围起来,中心可放可不放,总r*k的最小值是多少,有多个相等的时候取r较小的那个.
坑死人的二分有木有,我很想看看此題的全部测试数据,我wa在哪组。
AC代码:
AC代码
1 #include<cstdio> 2 #include<cmath> 3 4 typedef long long LL; 5 6 LL n,num_r; 7 //n:输入的n,num_r:r的循环. 8 9 LL deal(LL x){ 10 //返回-1表示太大,0表示相等(成立),1表示太小。 11 LL i,temp=1; 12 LL tol=0; 13 for(i=0;i<num_r;i++){//摆放蜡烛的总数 14 temp*=x; 15 if(temp>n) return -1; 16 tol+=temp; 17 if(tol>n) return -1; 18 } 19 if(tol==n) return 0; 20 return 1; 21 } 22 23 LL Find(){ 24 LL mid,res; 25 LL l=2,r=(long long)sqrt((double)n); 26 //当我r=n来二分的时候wa到我想哭了,为什么wa我现在都搞不清楚。 27 while(l<=r){ 28 mid=(l+r)/2; 29 res=deal(mid); 30 if(!res) return mid; 31 if(res==1) l=mid+1; 32 else r=mid-1; 33 } 34 return -1; 35 } 36 37 int main(){ 38 LL m,r,k; 39 while(~scanf("%lld",&n)){ 40 for(num_r=2,k=n-1,r=1;num_r<40;num_r++){//初始时r=1,k=n-1(一直没有成立的时候); 41 m=Find(); 42 if(m==-1) continue; 43 if(num_r*m<r*k) r=num_r,k=m; 44 } 45 for(n--,num_r=2;num_r<40;num_r++){//当中间放蜡烛的时候. 46 m=Find(); 47 if(m==-1) continue; 48 if(num_r*m<r*k||(num_r*m==r*k && num_r<r)) r=num_r,k=m; 49 } 50 printf("%lld ",r); 51 printf("%lld\n",k); 52 } 53 return 0; 54 }
wa到我想哭的代码:
wa的代码
1 #include<cstdio> 2 3 typedef long long LL; 4 5 LL n,num_r; 6 7 inline LL deal(LL x){ 8 LL i,temp=1,tol=0; 9 for(i=0;i<num_r;i++){ 10 temp*=x; 11 if(temp>n) return -1; 12 tol+=temp; 13 if(tol>n) return -1; 14 } 15 if(tol==n) return 0; 16 return 1; 17 } 18 19 inline LL Find(LL l,LL r){ 20 LL mid,res; 21 while(l<=r){ 22 mid=(l+r)/2; 23 res=deal(mid); 24 if(!res) return mid; 25 if(res==1) l=mid+1; 26 else r=mid-1; 27 } 28 return -1; 29 } 30 31 int main(){ 32 LL m,r,k; 33 while(~scanf("%lld",&n)){ 34 for(num_r=2,k=n-1,r=1;num_r<=40;num_r++){ 35 m=Find(2,n); 36 if(m==-1) continue; 37 if(num_r*m<r*k) r=num_r,k=m; 38 } 39 for(n--,num_r=2;num_r<=40;num_r++){ 40 m=Find(2,n); 41 if(m==-1) continue; 42 if(num_r*m<r*k||(num_r*m==r*k && num_r<r)) r=num_r,k=m; 43 } 44 printf("%lld ",r); 45 printf("%lld\n",k); 46 } 47 return 0; 48 }
如果有谁知道我为什么wa的话,请指教,求指教。


浙公网安备 33010602011771号