hdu 4430 Yukari's Birthday(二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4430

题意:要在一个蛋糕上放置n个糖果,摆成r个同心圆,每个同心圆的糖果数为k^i,中间圆心可以放一个糖果或者不放,使得r*k最小,若有多个答案输出r最小的那个。

18<=n<=10^12,k>=2,1<=i<=r

分析:r最多也就40,而k最多100000,枚举r,然后二分找出k就行了,二分的时候sum可能会溢出,所以判断是否大于n跳出就行了,其实不难的,但是由于我的疏忽看错题意了,没注意到中心可放或可不放,导致wa到死,练习的时候坑队友坑到结束,应该认真看看题目的,哎~~~~

AC代码:

 1 #include<stdio.h>
 2 #define LL long long
 3 #define INF 0x7fffffff
 4 LL binary(int r,LL n)
 5 {
 6     int i;
 7     LL low=2,high=1000000,mid,s,sum;
 8     while(low<=high)
 9     {
10         mid=(low+high)>>1;
11         s=1,sum=1;
12         for(i=1;i<=r;i++)
13         {
14             s*=mid;
15             sum+=s;
16             if(sum>n)
17                 break;
18         }
19         if(sum==n)
20             return mid;
21         else if(sum>n)
22             high=mid-1;
23         else
24             low=mid+1;
25     }
26     return -1;
27 }
28 int main()
29 {
30     int r,i;
31     LL n,k,tmp,Min;
32     while(scanf("%lld",&n)!=EOF)
33     {
34         Min=INF;
35         r=1,k=n-1;
36         for(i=1;i<64;i++)
37         {
38             tmp=binary(i,n);
39             if(tmp!=-1)
40             {
41                 if(tmp*i<Min)
42                 {
43                     Min=tmp*i;
44                     r=i,k=tmp;
45                 }
46             }
47             tmp=binary(i,n+1);
48             if(tmp!=-1)
49             {
50                 if(tmp*i<Min)
51                 {
52                     Min=tmp*i;
53                     r=i,k=tmp;
54                 }
55             }
56         }
57         printf("%d %lld\n",r,k);
58     }
59     return 0;
60 }
View Code

 

posted on 2013-11-03 23:12  jumpingfrog0  阅读(731)  评论(0编辑  收藏  举报

导航