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

View Code
 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 }

以后要多敲代码和认真看英文题!!!!!

posted @ 2012-10-16 21:22  _sunshine  阅读(447)  评论(0编辑  收藏  举报