【题目】
题目描述:
小 想搭一个体积不超过 的塔,他有各种大小的立方积木,比如边长为 的积木,体积为 ,现在小 需要你给一个 ,每次小 会用一个体积不超过 的最大积木,依次到搭好为止,现在他想最大化积木的个数,同时在积木个数最大的情况下使 最大
输入描述:
一行一个数
输出描述:
一行两个数,最多积木数以及
样例数据:
输入
48
输出
9 42
提示
备注:
【样例解释】
= 23 或 42 都是 9 次,42 = + +
【数据范围】
30%:m ≤
50%:m ≤
100%:m ≤
【代码】
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,m,ans,sum;
void solve(long long m,long long s,long long n)
{
if(m==0)
{
if(n>ans||(n==ans&&s>sum))
{
ans=n;
sum=s;
}
return;
}
long long a=floor(pow(m,1.0/3));
solve(m-a*a*a,s+a*a*a,n+1);
solve(3*a*a-3*a,s+(a-1)*(a-1)*(a-1),n+1);
}
int main()
{
// freopen("tower.in"."r",stdin);
// freopen("tower.out","w",stdout);
scanf("%lld",&m);
solve(m,0,0);
printf("%lld %lld",ans,sum);
// fclose(stdin);
// fclose(stdout);
return 0;
}