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;
    }
    
  • 相关阅读:
    PathInfo模式,thinkPHP模板与控制之间的关系
    thinkPHP无法显示验证码问题
    jQuery.validate 中文API手册
    MySQL 常用函数
    MySQL插入、更新与删除数据 习题
    MySQL查询语句练习题
    在windows下SphinxCoreseek的配置安装与测试
    Ubuntu上Coreseek+PHP的安装
    Ubuntu下安装CoreSeek
    Ubuntu更新命令
  • 原文地址:https://www.cnblogs.com/mollnn/p/14478936.html
Copyright © 2011-2022 走看看