给定程序中的逻辑错误找不到它

时间:2019-02-07 03:22:15

标签: c++ math runtime-error c++14

在此问题中,我们给了两个数组N,大小均为N的attackArray和defArray。

现在,我们认为每个数组元素都可以说得更扎实。 我们需要输出大于其邻居且大于其总和的特定元素。如果可以输出多个元素,则输出最大的元素。

-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 :(得分:0)

它适用于第一行,因为defArray中的第一个元素大于邻居的攻击,因此它不需要进入循环(您需要专门检查第一个元素)。

它适用于第三行,因为defArray中的最后一个元素大于邻居的攻击,因此它不需要进入循环(您专门检查最后一个元素)。

它对于第一个项之后的循环中的任何项都不起作用,因为defArray中的某项不大于您调用break;的邻居的攻击并退出循环。您需要检查defArray中的每个元素,但是一旦任何元素失败,循环就会停止。您为什么仍要打{{1​​}}?

我还没有测试所有边界条件,但是删除break;似乎可以解决问题……