首页 > 解决方案 > 给定程序中的逻辑错误找不到它

问题描述

在这个问题中,我们有两个数组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;
}

标签: c++mathruntime-errorc++14

解决方案


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

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

它不适用于第一个之后的循环中的任何项目,因为只要 defArray 中的某些内容不大于您调用的邻居的攻击break;并退出循环。您需要检查 defArray 中的每个元素,但只要任何元素失败,循环就会停止。你为什么还要打电话break;

我还没有测试所有的边界条件,但删除break;似乎确实可以解决它......


推荐阅读