关于主函数中循环顺序的改变,影响近100倍的效率。
const int maxn=1e5+10,maxm=30,maxh=1e9+10;
int N,M,ans=maxh,sum[maxm],cost[maxm],sqr[maxn];
int main(){
freopen("in.txt","r",stdin);
N=qd(),M=qd();
for(int i=1;i*i<=N;i++)
for(int j=i*i;j<=N&&j<(i+1)*(i+1);j++) sqr[j]=i;
for(int i=1;i<=M;i++)
sum[i]=sum[i-1]+i*i*i,cost[i]=cost[i-1]+2*i*i;
for(int i=sqr[(N-sum[M-1])/M];i>=M;i--)
for(int j=(N-sum[M-1])/i/i;j>=M;j--)
dfs(N-i*i*j,i,j,M-1,2*i*j+i*i);
printf("%d\n",ans==maxh?0:ans);
return 0;
}
所指的最后一个循环,原本长这个样子:
for(int i=M;i*i*M+sum[M-1]<=N;i++) for(int j=M;i*i*j+sum[M-1]<=N;j++) dfs(N-i*i*j,i,j,M-1,2*i*j+i*i);
然后会T,跑的特别慢。修改了之后最大点5ms。