在此问题中,我们给了两个数组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;
}
答案 0 :(得分:0)
它适用于第一行,因为defArray中的第一个元素大于邻居的攻击,因此它不需要进入循环(您需要专门检查第一个元素)。
它适用于第三行,因为defArray中的最后一个元素大于邻居的攻击,因此它不需要进入循环(您专门检查最后一个元素)。
它对于第一个项之后的循环中的任何项都不起作用,因为defArray中的某项不大于您调用break;
的邻居的攻击并退出循环。您需要检查defArray中的每个元素,但是一旦任何元素失败,循环就会停止。您为什么仍要打{{1}}?
我还没有测试所有边界条件,但是删除break;
似乎可以解决问题……