使用push_back()和pop_back操作进行向量分配如何产生垃圾值

时间:2019-04-08 15:18:17

标签: c++ vector garbage push-back

我正在解决一个问题,我必须从数组中找出那些元素的总和最大。但是存在一个条件,即两个相邻元素不能成为该max子数组的一部分。这是我的代码,使用简单的蛮力解决方案-

#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

输出-

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

预期输出-

4 8
1 3
12
3 5
10

因此,有5个测试用例。对于第一个测试用例和最后两个测试用例,输出正确。但是对于第二和第三个测试用例,它给出了垃圾值。问题是,在某些测试用例中,它给出了垃圾值,而在其他情况下则没有。

2 个答案:

答案 0 :(得分:1)

    for (i = n; i >= 0; i--)
    {
        if (b[i])
            cout << b[i] << " ";
    }

这会在n+1中打印出b个值。但是,即使在最佳情况下,b也只有n个值(对于n=1)。对于n>1b.size()小于n,因此您正在从向量存储的外部读取垃圾(这是未定义的行为)。只需使用正确的界线即可:

for (i = b.size() - 1; i >= 0; ++i)

答案 1 :(得分:0)

我想我发现了您的(第一个)问题:

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

当所有数字均为负数时,将输出其中最大的数字。

但是空数组的总和为0,并且大于负数,并且其中没有2个相邻成员。所以很明显,正确的答案应该是0,而不是m。