题解:
设当前上界为m,a为满足a^3<=m的最大的a;
考虑当前可以选的数不超过a,上界为m:
如果要选(a-k)时,上界应该调整到(a-k+1)^3-1;
显然可以选a;
当选(a-1)时,如果上界-(a-1)^3<m-a^3时,肯定是a更优,不用考虑a-1;否则a-1可能更优;
我们下面来证明<=a-2的为什么不行:
(a-1)^3-1-(a-2)^3<=a^3-1-(a-1)^3,且形成的X显然比a和a-1小
因此显然<=a-2的都不优
所以每次搜a和a-1就行了
感受一下层数不会太深,dfs即可
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll ans1,ans2; 5 ll cho[30]; 6 ll get(ll x) 7 { 8 ll l=1,r=100000,ans=1; 9 while(l<=r) 10 { 11 ll mid=(l+r)>>1; 12 if(mid*mid*mid<=x)ans=mid,l=mid+1; 13 else r=mid-1; 14 } 15 return ans; 16 } 17 void dfs(ll m,ll n,ll x) 18 { 19 if(!m) 20 { 21 if(n>ans1)ans1=n,ans2=x; 22 if(n==ans1)ans2=max(ans2,x); 23 return; 24 } 25 ll a=get(m); 26 dfs(m-a*a*a,n+1,x+a*a*a); 27 if(a*a*a-1-(a-1)*(a-1)*(a-1)>m-a*a*a)dfs(a*a*a-1-(a-1)*(a-1)*(a-1),n+1,x+(a-1)*(a-1)*(a-1)); 28 } 29 int main() 30 { 31 ll m; 32 scanf("%I64d",&m); 33 dfs(m,0,0); 34 printf("%I64d %I64d\n",ans1,ans2); 35 return 0; 36 }