RTE(越界)求助,玄关
查看原帖
RTE(越界)求助,玄关
545809
ToastBread楼主2024/8/28 10:10

原题可 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();
}
2024/8/28 10:10
加载中...