Как распределение вектора с использованием push_back () и операции pop_back дает значения мусора - PullRequest
0 голосов
/ 08 апреля 2019

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

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int t;
    cin >> t;
    while (t != 0)
    {
        int n, i, s, k = 0, m = -1001;
        vector< int > a;
        cin >> n;
        a.resize(n, 0);
        vector< int > b;
        for (i = 0; i < n; i++)
        {
            cin >> a[i];
            m = max(m, a[i]);
            if (a[i] < 0)
            {
                a[i] = 0;
                ++k;
            }
        }
        if (k == n)
            cout << m;
        else
        {
            k = 0;
            s = a[0];
            b.push_back(a[0]);
            for (i = 1; i < n; i++)
            {
                if (i != k + 1)
                {
                    if (a[i])
                    {
                        s += a[i];
                        b.push_back(a[i]);
                        k = i;
                    }
                }
                else
                {
                    if (s - a[i - 1] + a[i] > s)
                    {
                        b.pop_back();
                        s -= a[i - 1];
                        s += a[i];

                        b.push_back(a[i]);

                        ++k;
                    }
                }
            }
        }
        cout << endl;
        for (i = n; i >= 0; i--)
        {
            if (b[i])
                cout << b[i] << " ";
        }
        cout << endl;
        --t;
    }
    return 0;
}

Здесь вводится код- Первая строка представляет нет. тестовых случаев, Вторая строка представляет размер массива А следующая строка показывает элементы массива. M

5
5
-1 7 8 -5 4 
4
3 2 1 -1 
4
11 12 -2 -1 
4
4 5 4 3 
4
5 10 4 -1

output-

4 8 
32 32607 -787829912 1 3 
32 32607 -787829912 12 
3 5 
10 

Ожидаемый результат-

4 8
1 3
12
3 5
10

Итак, есть 5 тестовых случаев. Для первого и двух последних тестовых примеров выходные данные верны. Но для второго и третьего контрольного примера это дает значение мусора. В чем проблема, что для одних тестовых случаев это дает значение мусора, а для других нет.

Ответы [ 2 ]

1 голос
/ 08 апреля 2019
    for (i = n; i >= 0; i--)
    {
        if (b[i])
            cout << b[i] << " ";
    }

Это печатает n+1 значения в b. Но даже в лучшем случае b имеет только значения n (для n=1). А для n>1, b.size() меньше n, поэтому вы читаете мусор вне хранилища вектора (это неопределенное поведение ). Просто используйте правильную границу:

for (i = b.size() - 1; i >= 0; ++i)
0 голосов
/ 08 апреля 2019

Кажется, я нашел вашу (первую) проблему:

if(k==n)
cout<<m;

Когда все числа отрицательны, выводится наибольшее из них.

Но пустой массив имеет сумму 0 и больше отрицательного числа, и в нем нет 2 смежных членов. Поэтому ясно, что правильный ответ должен быть 0, а не м.

...