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的话,请指教,求指教。

posted @ 2012-10-17 20:11  舞步い嫣语逝爱醉灵魂  阅读(170)  评论(2)    收藏  举报