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

 

你可能感兴趣的:(birt)