您的位置:首页 > 其它

hdu 4430 Yukari's Birthday(二分)

2013-11-03 23:12 405 查看
题目链接: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代码:

#include<stdio.h>
#define LL long long
#define INF 0x7fffffff
LL binary(int r,LL n)
{
int i;
LL low=2,high=1000000,mid,s,sum;
while(low<=high)
{
mid=(low+high)>>1;
s=1,sum=1;
for(i=1;i<=r;i++)
{
s*=mid;
sum+=s;
if(sum>n)
break;
}
if(sum==n)
return mid;
else if(sum>n)
high=mid-1;
else
low=mid+1;
}
return -1;
}
int main()
{
int r,i;
LL n,k,tmp,Min;
while(scanf("%lld",&n)!=EOF)
{
Min=INF;
r=1,k=n-1;
for(i=1;i<64;i++)
{
tmp=binary(i,n);
if(tmp!=-1)
{
if(tmp*i<Min)
{
Min=tmp*i;
r=i,k=tmp;
}
}
tmp=binary(i,n+1);
if(tmp!=-1)
{
if(tmp*i<Min)
{
Min=tmp*i;
r=i,k=tmp;
}
}
}
printf("%d %lld\n",r,k);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: