hdu 4430 Yukari's Birthday(二分)

本文详细介绍了如何解决HDU 4430问题,即在蛋糕上放置指定数量的糖果形成同心圆,并找到糖果分配和同心圆数量的最小组合。通过枚举和二分查找方法,实现高效的求解过程。

题目链接: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

 

转载于:https://www.cnblogs.com/frog112111/p/3405659.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值