【2018/09/22测试T2】【WOJ 3977】塔

【题目】

题目描述:

A 想搭一个体积不超过 m 的塔,他有各种大小的立方积木,比如边长为 a 的积木,体积为 a^3,现在小 A 需要你给一个 X,每次小 A 会用一个体积不超过 X 的最大积木,依次到搭好为止,现在他想最大化积木的个数,同时在积木个数最大的情况下使 X 最大

输入描述:

一行一个数 m

输出描述:

一行两个数,最多积木数以及 X

样例数据:

输入

48

输出

9 42

提示

备注:

【样例解释】

X = 23 或 42 都是 9 次,42 = 3^3 + 2^3 + 7\times 1^3

【数据范围】

30%:m ≤ 10^5

50%:m ≤ 10^{10}

100%:m ≤ 10^{15}

【代码】

#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;
}

猜你喜欢

转载自blog.csdn.net/forever_dreams/article/details/82855299