1. 程式人生 > >【2018/09/22測試T2】【WOJ 3977】塔

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