我正在尝试为编程竞赛编写以下程序(已经结束)。但是,我一直收到SIGABRT错误。在运行下一个测试用例之前,我确保清空所有容器。我该怎么检查?
这就是我实现代码的方式: http://discuss.codechef.com/questions/29659/lowsum-editorial
#include<stdio.h>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
class compare
{
public:
bool operator()(int a, int b)
{
return a>b;
}
};
int main()
{
int T,K,Q;
vector<int> A,B,q,nsum;
priority_queue<int, vector<int> , compare> PQ; //min PQ
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&K,&Q);
A.resize(K);
B.resize(K);
q.resize(Q);
for(int i= 0;i<K;++i)
scanf("%d",&A[i]);
for(int i=0;i<K;++i)
scanf("%d",&B[i]);
int max_q=0;
for(int i=0;i<Q;++i)
{
scanf("%d",&q[i]);
if(q[i]>max_q)
max_q=q[i];
}
sort(A.begin(),A.end());
sort(B.begin(),B.end());
while(!PQ.empty())
PQ.pop();
int j=0;
while(max_q > 0 && j < K)
{
for(int i=0;i<K;++i)
PQ.push(A[i]+B[j]);
max_q--;
j++; //next element of B[]
}
while(!PQ.empty())
{
nsum.push_back(PQ.top());
PQ.pop();
}
for(int j=0;j<Q;++j)
printf("%d\n",nsum[q[j]-1]);
nsum.clear();
}
}
答案 0 :(得分:0)
我认为你正在记忆中。
首先将数组调整为0。否则,resize应该复制两个数组中常见的内容,因此需要首先分配一个新的entrie数组,复制所有内容,然后释放旧的数组。
对于这些类型的东西,你可以在乞讨时调整向量的大小,以应对可能的最大测试用例,然后再也不要再触摸它们了。