Description
小A想搭一个体积不超过m的塔,他有各种大小的立方积木,比如边长为a的积木,体积为a^3,现在小A需要你给一个X,每次小A会用一个体积不超过X的最大积木,依次到搭好为止,现在他想最大化积木的个数,同时在积木个数最大的情况下使X最大m<=10^15
分析
这里的m非常的大,枚举x是不可能的。
对于一个m,
可以取的最大值是
3m−−√
下取整。
设a=
3m−−√
我们可以取的就是1..a
如果我们现在取了a,那么剩下的就是
m−a3
如果我们现在取了a-1,也就是说,我们以后的和的最大值要小于 a3 ,否则剩下的数就会被 a3 所取代。所以剩下的就是 a3−1−(a−1)3=3∗a2−3∗a
如果我们现在取了a-2,同理剩下的就是 (a−1)3−1−(a−2)3 ,显然这个没有取a-1优。
所以我们对于一个m,可能成为最优答案的就是取a,或者取a-1。
code
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <math.h>
#define N 10003
#define ll long long
using namespace std;
ll n,m,ans,sum;
void dg(ll m,ll s,ll n)
{
if(m==0)
{
if(n>ans || (n==ans && s>sum))
{
ans=n;
sum=s;
}
return;
}
ll a=floor(pow(m,1.0/3));
dg(m-a*a*a,s+a*a*a,n+1);
dg(3*a*a-3*a,s+(a-1)*(a-1)*(a-1),n+1);
}
int main()
{
scanf("%lld",&m);
dg(m,0,0);
printf("%lld %lld",ans,sum);
}