码迷,mamicode.com
首页 > 其他好文 > 详细

CF 680D 贪心+构造.

时间:2017-08-16 23:11:36      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:空间   最大   ==   style   code   方案   选择   状态   dfs   

题意:若当前体积为X,则每次选一个最接近X的三次方数(p^3<=X)填入.

确定不超过m的X,使得操作次数最多?若有最大操作次数有多种方案,输出X最大的那一种. m<=1e15.

 

x确定ans也就确定 m很大 直接确定x是不可能的.
令最大的a满足,a^3<=m. 则第一个塞的长度最大为a,最多剩下m-a^3
如果塞边长a-1的 则体积最大剩下a^3-1-(a-1)^3 保证一开始的体积<a^3.
塞a-2的 则最大剩下 (a-1)^3-1-(a-2)^3 此时同样塞了一个,第二个可以选择的空间明显更大 则只考虑前两个即可.(第一个剩余相对大小未知)
某个初始状态塞完a-2后若剩余体积为x 则可以构造出另外一个初始状态塞完(a-1)后也为x. 塞(a-1)绝对不会差.
每次X最大可选范围减少m^(1/3) 暴力dfs即可.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> ii;
const int N=2e5+20;
ll m;
ii ans;
ll f(ll a)
{
    return a*a*a;
}
void dfs(ll m,ll cur,ll vol)
{
    if(m==0)
    {
        ans=max(ans,ii(cur,vol));
        return;
    }
    ll a=0;
    while(f(a+1)<=m)
        a++;
    dfs(m-a*a*a,cur+1,vol+a*a*a);
    if(a-1>=0)
    {
        ll t=(a-1);
        dfs(a*a*a-1-t*t*t,cur+1,vol+t*t*t);
    }
}
int main()
{
    while(cin>>m)
    {
        dfs(m,0,0);
        printf("%I64d %I64d\n",ans.first,ans.second);
    }
    return 0;
}
 

 

CF 680D 贪心+构造.

标签:空间   最大   ==   style   code   方案   选择   状态   dfs   

原文地址:http://www.cnblogs.com/HIKARI1149/p/7376279.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!