“Sigabrt错误” - Codechef

时间:2014-03-14 20:42:14

标签: runtime sigabrt

以下代码在我的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;
}

1 个答案:

答案 0 :(得分:4)

由于引用codechef

的原因很多,

发送SIGABRT信号

  

SIGABRT错误是由于致命错误导致程序中止造成的。在C ++中,这通常是由于C ++中的assert语句没有返回true,但是如果一些STL元素试图存储太多内存,则会产生这种情况。

在你的情况下,它似乎是使用过多的记忆

mot = new long long [k];
sat = new long long [k];
long long *sum = new long long[sq];

请注意,k的值可以大到20000,因此声明大小为k的数组会很好,但是sq = k*k的顺序为4 * 10 ^ 8,这会导致内存不足问题记忆。而且你的算法也不足以在时间限制内给AC。

Codechef有自己的论坛来提出这样的问题,并且已经讨论了解决这个问题的更好方法

  

http://discuss.codechef.com/problems/LOWSUM