Следующая проблема кодирования SIGSEGV Runtime Ошибка - PullRequest
0 голосов
/ 06 февраля 2019
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
    int T;
    cin>>T;

    do{
        vector<int> ans;
        int N=0;
        cin>>N;
        vector<int> attackArray(N), defArray(N);

        for (int i =0; i<N; i++) {
            cin>>attackArray[i];
        }
        for (int i =0; i<N; i++) {
            cin>>defArray[i];
        }


        for (int i =0; i<N; i++) {
   int nexti, previ;
if (i == 0)
{
    nexti = 1;
    previ = N - 1;
}
else if (i == N - 1)
{
    nexti = 0;
    previ = N - 2;
}
else
{
    nexti = i + 1;
    previ = i - 1;
}
if (defArray[i] > attackArray[nexti] && 
    defArray[i] > attackArray[previ] && 
    defArray[i] > attackArray[nexti] + attackArray[previ]){

        ans.push_back(defArray[i]);

    }
else {ans.push_back(-1); break;}

}

        sort(ans.begin(), ans.end(), greater<int>());
        cout<<ans[0]<<endl;

        T--;
    }while (T !=0);


    return 0;
}

Вход

Первая строка ввода содержит одно целое число T, обозначающее количество тестовых случаев.Описание Т-тестов приведено ниже.Первая строка каждого теста содержит одно целое число N. Вторая строка содержит N разделенных пробелом целых чисел a1, a2,…, aN.Третья строка содержит N разделенных пробелом целых чисел d1, d2,…, dN.

Выход

Для каждого теста выведите одну строку, содержащую одно целое число -лучшее защитное значение щита, который получает король, или -1, если шеф-повар может быть брошен в змеиную яму.

Пример

2

4

1 1 4 1

3 4 2 1

7

5 4 5 4 5 4 5

3 2 4 7 2 5 9

Пример Вывод

3

-1

1 Ответ

0 голосов
/ 06 февраля 2019

Проблема состоит в том, что ваша последовательность if операторов должна быть одним if ... else if ... else оператором.

if (i == 0)
    ...
else if (i==N-1)
    ...
else
    ...

То, что предыдущее условие if было оценено как true, не останавливает код послеif инструкция от выполнения, если вы не используете else.Таким образом, условие в вашем третьем операторе if выполняется даже при i == 0 или i == N - 1, что приводит к выходу за пределы массива и аварийному завершению.

Также

int attackArray[N],defArray[N];

не является допустимым C ++, потому что все размеры массива должны быть константами времени компиляции.Вы явно используете компилятор, который не заботится, но вы должны его использовать, поэтому используйте его вместо

vector<int> attackArray(N), defArray(N);

Наконец, в ваших различных условиях много дублированного кода.Вы можете сильно упростить, добавив пару дополнительных переменных для следующего и предыдущего значения i.Например,

int nexti, previ;
if (i == 0)
{
    nexti = 1;
    previ = N - 1;
}
else if (i == N - 1)
{
    nexti = 0;
    previ = N - 2;
}
else
{
    nexti = i + 1;
    previ = i - 1;
}
if (defArray[i] > attackArray[nexti] && 
    defArray[i] > attackArray[previ] && 
    defArray[i] > attackArray[nexti] + attackArray[previ])
    ...
...