Логическая ошибка в данной программе не может найти ее - PullRequest
0 голосов
/ 07 февраля 2019

В этой задаче нам даны два массива attackArray и defArray размером N.

Теперь мы думаем, что каждый элемент массива, скажем, солдат.Нам нужно вывести конкретный элемент, который больше его соседей и больше их суммы.Если несколько элементов могут выводить данные, выведите самый большой.

-1 Если такой элемент не найден.

Пользовательский ввод, который я пытался запустить с

Вход

4
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
5 8 1
5 6 20
20
46 35 17 37 39 48 10 49 44 11 36 4 2 22 16 41 26 8 15 40
4 41 6 35 49 50 28 46 22 17 13 36 31 2 33 14 150 47 29 39

Выход

3
-1
20
-1

.Последний вывод должен иметьбыл 150.

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    cin >> T;
    if (T > 100 || T < 1)
        return 0;

    do {
        vector<int> ans;
        int N;
        cin >> N;
        if (N > 100 || N < 3)
            return 0;
        vector<long long int> attackArray(N), defArray(N);

        for (int i = 0; i < N; i++) {
            cin >> attackArray.at(i);
        }
        for (int i = 0; i < N; i++) {
            cin >> defArray.at(i);
        }
        if (defArray.at(0) > attackArray.at(1) && defArray.at(0) > attackArray.at(N - 1) && defArray.at(0) > attackArray.at(1) + attackArray.at(N - 1)) {

            ans.push_back(defArray.at(0));
        }
        if (defArray.at(N - 1) > attackArray.at(0) && defArray.at(N - 1) > attackArray.at(N - 2) && defArray.at(N - 1) > attackArray.at(0) + attackArray.at(N - 2)) {

            ans.push_back(defArray.at(N - 1));
        }

        for (int i = 1; i < N - 1; i++) {
            int nexti, previ;

            nexti = i + 1;
            previ = i - 1;

            if (defArray.at(i) > attackArray.at(nexti) && defArray.at(i) > attackArray.at(previ) && defArray.at(i) > attackArray.at(nexti) + attackArray.at(previ)) {

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

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

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

    return 0;
}

1 Ответ

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

Это работает для первой строки, потому что первый элемент в defArray больше, чем атака соседей, поэтому ему не нужно входить в цикл (вы проверяете специально для первого элемента).

Этоработает для третьей строки, потому что последний элемент в defArray больше, чем атака соседей, поэтому он не должен входить в цикл (вы проверяете специально для последнего элемента).

Это не работаетдля любого элемента в цикле после первого, потому что как только что-то в defArray не станет больше, чем атака соседей, вы вызываете break; и выходите из цикла.Вам нужно проверить каждый элемент в defArray, но цикл останавливается, как только любой элемент выходит из строя.Почему вы звоните break; в любом случае?

Я не проверял все граничные условия, но удаление break;, кажется, исправило это ...

...