题意:若当前体积为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; }
时间: 2024-10-13 13:10:56