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代码:
View Code
题意:要在一个蛋糕上放置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
相关文章推荐
- HDU 4430 Yukari's Birthday(二分)
- hdu 4430 Yukari's Birthday (简单数学 + 二分)
- HDU 4430 Yukari's Birthday (二分)
- HDU 4430 Yukari's Birthday二分查找
- hdu 4430 Yukari's Birthday(二分+枚举)
- HDU 4430 Yukari's Birthday (二分+枚举)
- hdu 4430 Yukari's Birthday 枚举+二分
- HDU-4430-Yukari's Birthday-暴力+二分
- HDU 4430 Yukari's Birthday 二分
- HDU 4430 Yukari's Birthday 二分
- HDU 4430 Yukari's Birthday(枚举+二分)
- hdu 4430 Yukari's Birthday(二分+枚举)
- HDU 4430 Yukari's Birthday (二分+枚举)
- HDU 4430 Yukari's Birthday (枚举 二分)
- HDU 4430 & ZOJ 3665 Yukari's Birthday(二分+枚举)
- hdu 4430 Yukari's Birthday
- HDU 4430 Yukari's Birthday(枚举+二分)
- hdu 4430 Yukari's Birthday【二分】
- HDU 4430 Yukari's Birthday【二分+枚举】
- HDU ~ 4430 ~ Yukari's Birthday(二分or数学)