HDU 4430 Yukari's Birthday

题意:将蛋糕分成r层,每层可以插k^i个蜡烛(r>=1,k>=2),一共有n个蜡烛,输出当r*k最小时的r和k

解题思路:二分+枚举.因为最多有10^12个蜡烛,所以枚举r的时候枚举到50就可以了,对枚举出的每一个r二分查找k,查找的时候要注意防止爆long long,最后不断更新求最小的r和k即可,注意不能将x设为INF会WA,可能是因为k^i,x不会超过n

代码:

 

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

#define INF 0x3f3f3f3f
typedef long long ll;
ll n;
ll search_(ll rr)
{
    ll l=2,r=n;
    while(l<=r)
    {
        ll mid=(l+r)/2;
        ll sum=0,ans=1;
        for(ll i=1; i<=rr; i++)
        {
            if(n/ansn)break;
        }
        if(sum==n||sum==n-1)return mid;
        else if(sum>n)r=mid-1;
        else if(sum>n)
    {
        ll r,k,x=n;
        for(ll i=1; i<50; i++)
        {
            ll y=search_(i);
            if(y!=-1&&y*i

 

 

 

 

 

你可能感兴趣的:(OJ刷题)