680D - Bear and Tower of Cubes
思路:dfs+贪心,设剩余的体积为res,存在a,使得a3 ≤ res,每次取边长为a的立方体或者边长为a-1的立方体(这时体积上限变成a3 -1)。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset((a),(b),sizeof(a)) #define pil pair<int,ll> #define mp make_pair const int N=1e5+5; ll mm[N]; pil dfs(int cur,ll res,ll x) { //cout<<res<<endl; if(res==0) { //cout<<cur<<' '<<x<<endl; return mp(cur,x); } int a=upper_bound(mm+1,mm+N,res)-mm; a--; pil ans=dfs(cur+1,res-mm[a],x+mm[a]); if(a>1)ans=max(ans,dfs(cur+1,mm[a]-1-mm[a-1],x+mm[a-1])); return ans; } int main() { ios::sync_with_stdio(false); cin.tie(0); ll m; cin>>m; for(int i=1;i<N;i++)mm[i]=(ll)i*i*i; int a=upper_bound(mm+1,mm+N,m)-mm; a--; pil ans=dfs(1,m-mm[a],mm[a]); if(a>1)ans=max(ans,dfs(1,mm[a]-1-mm[a-1],mm[a-1])); cout<<ans.first<<' '<<ans.second<<endl; return 0; }