zoukankan      html  css  js  c++  java
  • dfs Codeforces Round #356 (Div. 2) D

    http://codeforces.com/contest/680/problem/D

    题目大意:给你一个大小为X的空间(X<=m),在该空间内,我们要尽量的放一个体积为a*a*a的立方体,且每次放入的立方体的体积要尽可能大,问最多能放几块?

    感觉自己还是太菜了。。。这种题目都做不来TAT

    思路:因为每次都要放入,我们找一下情况以后可以发现,假设当前的体积为x,如果要让cnt个数最多,要么就是要减去x-a*a*a,要么就是让x直接等于a*a*a-1,因此我们很容易就可以得到这是一个dfs的条件,然后我们只要利用dfs就好了

    //看看会不会爆int!数组会不会少了一维!
    //取物问题一定要小心先手胜利的条件
    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define ALL(a) a.begin(), a.end()
    #define pb push_back
    #define mk make_pair
    #define fi first
    #define se second
    #define haha printf("haha
    ")
    const int maxn = 100000 + 5;
    LL m, cnt;
    LL dp[maxn];
    map<LL, pair<LL, LL> > mp;///val, cnt and val
    
    pair<LL, LL> dfs(LL m){
        if (m == 0) return mk(0, 0);
        if (mp.count(m)) return mp[m];
        pair<LL, LL> &tmp1 = mp[m];
        int pos = lower_bound(dp + 1, dp + 1 + cnt, m) - dp;
        if (dp[pos] != m) pos--;
        tmp1 = dfs(m - dp[pos]);
        tmp1.fi += 1, tmp1.se += dp[pos];
    
        pair<LL, LL> tmp2 = dfs(dp[pos] - 1);
        return tmp1 = max(tmp1, tmp2);
    }
    
    int main(){
        scanf("%lld", &m);
        for (LL i = 1; 1LL*i*i*i <= m; i++) dp[i] = 1LL * i * i * i, cnt = i;
        cnt++;
        dp[cnt] = 1LL * cnt * cnt * cnt;
        pair<LL, LL> res = dfs(m);
        printf("%lld %lld
    ", res.fi, res.se);
        return 0;
    }
    View Code
  • 相关阅读:
    VS 无法命中断点解决
    sharepoint 什么开始系列呢?从哪里开始写呢?
    sqlserver 登录名与用户的关系
    Exchange 开启模拟用户
    Exchange(DC服务器开启防火墙,造成的问题)
    Exchange 2010 RPC 揭秘
    二维码生成
    【转】使用 Entity Framework + ListView + DataPager 实现数据分页
    24款超实用的Web 2.0风格翻页代码
    精心收集的jQuery常用的插件1000
  • 原文地址:https://www.cnblogs.com/heimao5027/p/5925555.html
Copyright © 2011-2022 走看看