如何解决 codechef ide 上的 sigabrt 错误

How do I resolve sigabrt error on codechef ide

Sigabrt 运行时发生致命错误,因为 assert 语句未返回 true?或者使用过多的内存,我无法弄清楚我在这里做错了什么,帮帮我?

(codeforces 上的问题 1343 C)link 所以这是代码。

#include <iostream>
#include <stdlib.h>
#include<vector>
using namespace std;
int check(int i,vector<int> a) {
    if (a[i] > 0) {
        return 1;
    }
    else return 0;
}

int main() {
    int t;
    cin >> t;
    while (t--) 
    {
        long int n;
        cin >> n;
        vector<int> a(n), b;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        int i = 0;
        while (i < n)
        {
            int max = a[i];
            int s = check(i,a);
            i++;

            while (i<n && check(i,a)== s) {
                if (a[i] > max)max = a[i];
                i++;    
            }
            b.push_back(max);
        }
        int s = 0;
        for (int k = 0; k< b.size(); k++) {
            s += b[i];
        }
        cout << s << endl;
    }
}



我已经调试了你的代码,并且修改后的代码已被接受用于上述问题

你犯的错误:

1. 在下面的循环中,vector<int> bi'th index 处的值被添加到 long int s。相反,b[k] 应该添加到 long int s,因为循环中使用的 变量是 k 而不是 i.

for (int k = 0; k< b.size(); k++) {
            s += b[i];
        }

2. 在问题中,variable n 的范围给出为 (1 ≤ n ≤ 2.10^5) .因此,使用 int n 而不是 long int n 是安全的。此外,当我在 codeforces 上提交我的代码时,当我使用 long int n.

时,它给了我 有符号整数溢出错误

3. 你需要使用long long s而不是long int s因为数组A的每个元素的值都在( −10^9 ≤ a[i] ≤ 10^9 , ai ≠ 0) 当我们添加元素时它可以 轻松超越 intlong int 范围.

4. 虽然,当我在函数

中使用 vector<int> a 时答案被接受了
int check(int i,vector<int> a) {
    if (a[i] > 0) {
        return 1;
    }
    else return 0;
}

但是正如用户 Scheff 所说并且是正确的,它会在 space 和时间上受到惩罚,您应该使用引用调用,即 vector<int> &a.

修改后的代码:

#include <iostream>
#include <stdlib.h>
#include<vector>
using namespace std;
int check(int i, vector<int> &a) {
    if (a[i] > 0) {
        return 1;
    }
    else return 0;
}

int main() {
    int t;
    cin >> t;
    while (t--) 
    {
        int n;
        cin >> n;
        vector<int> a(n), b;
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        
        
        int i = 0;
        while (i < n)
        {
            int max = a[i];
            int s = check(i,a);
            i++;

            while ((i<n) && (check(i,a)== s)) {
                if (a[i] > max)
                max = a[i];
                i++;    
            }
            b.push_back(max);
        }
        
        long long s = 0;
        for (int k = 0; k< b.size(); k++) {
            s += b[k];
        }
        cout << s << endl;
    }
}

已接受答案的屏幕截图: