[CF679B] Bear and Tower of Cubes

[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;
}
原文地址:https://www.cnblogs.com/mollnn/p/14478936.html