zoukankan      html  css  js  c++  java
  • [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;
    }
    
  • 相关阅读:
    Winform中设置ZedGraph曲线图的字体样式是避免出现边框
    50本精品前端开发书籍免费下载
    一切“归零”的开始
    小公司大企业
    给“精点们”的一封信
    一个程序员的自我救赎
    一个微服务框架的情节
    《深入理解Java虚拟机》虚拟机类加载机制
    一个微服务框架的故事
    一个程序员的自我剖析
  • 原文地址:https://www.cnblogs.com/mollnn/p/14478936.html
Copyright © 2011-2022 走看看