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 }
posted on 2013-11-03 23:12 jumpingfrog0 阅读(731) 评论(0) 编辑 收藏 举报