本题过度优化过不了数据,
70分代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ans=1e10;
int m;
int m1[19];
int m2[19];
void dfs(int x,int y,int sum,int xx,int yy){
//cout<<x<<" "<<y<<" "<<sum<<" "<<xx<<" "<<yy<<endl;
if(y==0){
if(x==y){
ans=min(ans,sum);
return;
}
return;
}
if(x<m1[y-1]){
return;
}
if(sum+m2[y-1]>=ans||x*2/xx+sum>=ans){
return;
}
for(int i=y;i<=xx;i++){
int sb;
sb=x-m1[y-1];
sb=sb/i/i;
sb=min(sb,yy);
for(int j=y;j<=sb;j++){
dfs(x-j*i*i,y-1,sum+j*i*2+(y==m?1:0)*i*i,i-1,j-1);
}
}
}
signed main(){
int n;
cin>>n>>m;
for(int i=1;i<=m;i++){
m1[i]=m1[i-1]+i*i*i;
m2[i]=m2[i-1]+2*i*i;
}
int st;
st=sqrt(n);
dfs(n,m,0,sqrt(n),n);
cout<<(ans>=1e9?0:ans);
return 0;
}
不幸的是,我只改了一行,就对了,你猜猜哪一行?
#include<bits/stdc++.h>
using namespace std;
#define int long long
int ans=1e10;
int m;
int m1[19];
int m2[19];
void dfs(int x,int y,int sum,int xx,int yy){
//cout<<x<<" "<<y<<" "<<sum<<" "<<xx<<" "<<yy<<endl;
if(y==0){
if(x==y){
ans=min(ans,sum);
return;
}
return;
}
if(x<m1[y-1]){
return;
}
if(sum+m2[y-1]>=ans||x*2/xx+sum>=ans){
return;
}
for(int i=xx;i>=y;i--){//换个顺序,就对了,可能是提前获得了答案能够减去更多枝杈,也不知道是不是数据的问题
int sb;
sb=x-m1[y-1];
sb=sb/i/i;
sb=min(sb,yy);
for(int j=y;j<=sb;j++){
dfs(x-j*i*i,y-1,sum+j*i*2+(y==m?1:0)*i*i,i-1,j-1);
}
}
}
signed main(){
int n;
cin>>n>>m;
for(int i=1;i<=m;i++){
m1[i]=m1[i-1]+i*i*i;
m2[i]=m2[i-1]+2*i*i;
}
int st;
st=sqrt(n);
dfs(n,m,0,sqrt(n),n);
cout<<(ans>=1e9?0:ans);
return 0;
}
崩溃了,题解没有一个说的,建议加。