Как устранить ошибку sigabrt на codechef ide - PullRequest
1 голос
/ 06 мая 2020

Ошибка выполнения Sigabrt возникает из-за фатальной ошибки из-за того, что оператор assert не возвращает истину? Или использование чрезмерного объема памяти, я не могу понять, что я здесь делаю не так, помогите мне?

(проблема 1343 C на codeforces) ссылка так вот код.

#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 Ответ

0 голосов
/ 21 июля 2020

Я отладил ваш код, а также измененный код был принят для указанного выше вопроса .

Ошибки, которые вы сделали:

1. В приведенном ниже l oop, значение i'th index из vector<int> b добавляется к long int s. Вместо этого b[k] следует добавить к long int s, потому что переменная , используемая в l oop, равна 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) , и когда мы добавляем элементы, он может легко превосходит int и long int диапазоны .

4. Хотя, ответ был принят, когда я использовал vector<int> a в функции

int check(int i,vector<int> a) {
    if (a[i] > 0) {
        return 1;
    }
    else return 0;
}

Но, как сказал и прав пользователь Шефф, это связано с ограничением пространства и времени, вы должны использовать вызов по ссылке, т.е. 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;
    }
}

Скриншот принятого ответа:

...