zoj3665
长春赛的K题~~~自己简直弱爆了~~
这道题和网络赛的一道数论题方法一样,都是枚举一个变量,二分查找另外一个变量,然后根据题意求就好了。
比赛的时候也是这么做的,可是有两个地方错了,WA了五个小时,呵呵(真无奈),真的弱爆了。
第一个错误:二分上下界弄错了,正确的是(1,开n的r次方),结果弄成了(开n的r次方,n)
第二个错误:“And it's optional to place at most one candle at the center of the cake.”其中是at most one,也就是可以是0或者是1,可是我理解成了必须有1个。
题目连接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3665
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <algorithm> 3 #include <math.h> 4 #include <cstdio> 5 using namespace std; 6 struct NODE{ 7 int r; 8 long long k,rk; 9 }p[40]; 10 int cmp(NODE M,NODE N){ 11 if(M.rk!=N.rk) return M.rk<N.rk; 12 return M.r<N.r; 13 } 14 long long n; 15 int X(long long k,int r){ 16 long long s=1,res=1; 17 for(int i=1;i<=r;i++){ 18 s*=k; 19 res+=s; 20 if(res>1e12) return 0; 21 } 22 if(res-n==0||res-n==1) return 2; 23 else if(res-n<0) return 1; 24 else return 0; 25 } 26 int main(){ 27 int flag,top; 28 long long right,left,mid; 29 while(scanf("%lld",&n)!=EOF){ 30 31 top=0; 32 p[top].r=1; 33 p[top].k=n-1; 34 p[top].rk=p[top].r*p[top].k; 35 top++; 36 37 for(int i=2;i<40;i++){ 38 left=1; 39 right=(long long)pow(n,1.0/(double)i); 40 while(left<right){ 41 mid=(left+right)>>1; 42 flag=X(mid,i); 43 if(flag==2) {left=mid;break;} 44 else if(flag==1) left=mid+1; 45 else right=mid; 46 } 47 if(X(left,i)==2){ 48 p[top].r=i; 49 p[top].k=left; 50 p[top].rk=p[top].r*p[top].k; 51 top++; 52 } 53 } 54 sort(p,p+top,cmp); 55 printf("%d %lld\n",p[0].r,p[0].k); 56 } 57 return 0; 58 }
以后要多敲代码和认真看英文题!!!!!