[CF679B] Bear and Tower of Cubes - 搜索
Description
Limak要垒一座由立方体垒成的塔。现有无穷多个不同棱长(a>=1)的立方体。要求:1、塔的体积为X(X<=m).2、在小于X的前提下,每次都选体积最大的砖块。3、在砖块数最多的前提下,使X尽可能大。求最终垒成塔所用的最大砖块数和塔可能的最大体积(在砖块数最多的前提下)。
Solution
假设当前剩下的体积限制为 res,能用的最大棱长是 t
如果我们取 t,当然可以,那么下次能用的体积就是 res-pow(t,3),下次能用的最大棱长不超过 t
如果我们取 t-1,也可以,但是下次能用的体积就是 pow(t,3)-pow(t-1,3)-1,下次能用的最大棱长不超过 t-1
类似,如果我们取 t-2,却会发现这样的答案一定不如取 t-1 优
类似地,t-2 以下的都可以忽略
所以我们考虑一个 dfs,状态量维护当前的体积限制、实际个数、实际体积,然后枚举本次是选择 t 还是 t-1,转移即可
#include <bits/stdc++.h>
using namespace std;
#define int long long
pair<int, int> ans;
void solve(int res, int cnt, int vol)
{
if (res == 0)
ans = max(ans, {cnt, vol});
else
{
int t = pow(res, 0.33);
while ((t + 1) * (t + 1) * (t + 1) <= res)
++t;
solve(res - t * t * t, cnt + 1, vol + t * t * t);
solve(t * t * t - (t - 1) * (t - 1) * (t - 1) - 1, cnt + 1, vol + (t - 1) * (t - 1) * (t - 1));
}
}
signed main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
solve(n, 0, 0);
cout << ans.first << " " << ans.second << endl;
}