以下代码在我的 DEV-C++ 编译器中完美运行,但是当我在 codechef 中提交时,运行 3-4 秒后显示“SIGABRT ERROR”。我已经研究了这个错误,并尽我所能调试,但即使一周后我也无法调试。请帮忙 !!提前致谢。
参考问题是http://www.codechef.com/problems/LOWSUM
enter code here
void selsort(long long *ssum,long long len)
{
long long low;
for(long long i=0;i<len;i++)
{
low = ssum[i];
long long pos=i;
for(int j=i+1;j<len;j++)
{
if(ssum[j]<low)
{
low = ssum[j];
pos = j;
}
}
ssum[pos] = ssum[i];
ssum[i] = low;
}
}
int main()
{
int t,k,q;
cin>>t;
for(int i=0;i<t;++i)
{
cin>>k;
cin>>q;
long long sq = k*k;
long long *mot=NULL,*sat=NULL;
mot = new long long [k];
sat = new long long [k];
long long *sum = new long long[sq];
long long qth;
long long b=0;
for(int j=0;j<k;++j)
{
cin>>mot[j];
}
for(int j=0;j<k;++j)
{
cin>>sat[j];
}
for(int j=0;j<k;++j)
{
for(int a=0;a<k;++a)
{
sum[b] = mot[a]+sat[j];
++b;
}
}
selsort(sum,sq);
for(int j=0;j<q;++j)
{
cout<<"\n";
cin>>qth;
cout<<"\n"<<sum[qth-1];
}
delete []sum;
delete []mot;
delete []sat;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
由于引用codechef 的多种原因发送 SIGABRT 信号
SIGABRT 错误是由您的程序由于致命错误而中止引起的。在 C++ 中,这通常是由于 C++ 中的断言语句未返回 true,但如果某些 STL 元素尝试存储过多内存,则可能会生成此错误。
在您的情况下,似乎是使用了过多的内存
mot = new long long [k];
sat = new long long [k];
long long *sum = new long long[sq];
Run Code Online (Sandbox Code Playgroud)
请注意,k 的值可以大到 20000,因此声明一个大小为 k 的数组会很好,但是您的数组大小sq = k*k为 4*10^8,这会导致内存不足问题。而且你的算法也不够好,无法在时限内给出 AC。
Codechef 有自己的论坛来问这些问题,并且已经讨论了解决这个问题的更好方法