原题可 AC,样例可 AC,交上去就直接segmentation fault (SIGSEGV)。
自调试无果,感觉是个很弱智的错误,求各位dalao帮忙,万分感谢。
玄关。
// for(int j=1;j<=m-i;j++){
// tmp+=(ri-j)*(ri-j)*(hi-j);
// }
// if(e_vi>tmp){
// return;
// }
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,m,nowr[200],nowh[200],minans=1145141919,minx[200];
void dfs(int layer,int nowv,int nows)
{
//1cout<<"nowdfs:("<<layer<<","<<nowv<<","<<nows<<")"<<endl;
if(layer>m&&nowv==0)
{
minans=min(minans,nows);
//cout<<minans<<endl;
return;
}
if(layer>m) return;
if(nows>minans) return;
if(nowv<minx[m-layer]) return;
if(layer>1)
{
int tmp=0;
for(int j = 1; j <= m-layer+1; j++)
{
tmp+=(nowr[layer-1]-j)*(nowr[layer-1]-j)*(nowh[layer-1]-j);
}
if(nowv>tmp)
{
return;
}
}
if(layer==1)
{
//cout<<123<<endl;
int nowmaxi=(int)sqrt(n);
for(int i = m; i <= nowmaxi; i++)
{
int nowmaxj=n/(i*i);
for(int j = m; j <= nowmaxj; j++)
{
nowr[1]=i;
nowh[1]=j;//if(v-(r[x-1])*(r[x-1])*(h[x-1])*z>0) return;
dfs(2,nowv-(i*i*j),nows+(i*i+2*i*j));
}
}
}
else
{
//cout<<123<<endl;
int nowmaxi=min((int)sqrt(nowv),nowr[layer-1]-1);
for(int i = nowmaxi; i >= (m-layer+1); i--)
{
int nowmaxj=min(nowv/(i*i),nowh[layer-1]-1);
if(nows+2*nowv/i > minans) break;
for(int j = (m-layer+1); j <= nowmaxj; j++)
{
//cout<<123<<endl;
nowr[layer]=i;
nowh[layer]=j;
//if((nowv-(i*i*j))<=maxx[layer][i][j]) dfs(layer+1,nowv-(i*i*j),nows+(2*i*j));
dfs(layer+1,nowv-(i*i*j),nows+(2*i*j));
}
}
}
}
int sol()
{
cin>>n>>m;
minans=1145141919;
memset(nowr,0,sizeof(nowr));
memset(nowh,0,sizeof(nowh));
memset(minx,0,sizeof(minx));
for(int i = 1; i <= m; i++)
{
minx[i]=minx[i-1]+i*i*i;
}
dfs(1,n,0);
if(minans==1145141919) cout<<0<<endl;
else cout<<minans<<endl;
}
int main()
{
int t;
cin>>t;
while(t--) sol();
}