给定两个数组 a1,a2,…,an 和 b1,b2,…,bn。
在一次操作中,你可以选择任意一个整数 i,其中 1≤i≤n,并交换 ai 和 bi。
确定在使用任意(可能为零)次操作后,是否可以同时满足以下两个条件:
an=max(a1,a2,…,an),bn=max(b1,b2,…,bn)。
其中 max(c1,c2,…,ck) 表示 c1,c2,…,ck 中的最大数。例如,max(3,5,4)=5,max(1,7,7)=7,max(6,2)=6。
输入
每个测试包含多个测试用例。第一行包含测试用例的数量 t(1≤t≤200)。接下来是测试用例的描述。
每个测试用例的第一行包含一个整数 n(1≤n≤100)——数组的长度。
每个测试用例的第二行包含 n 个整数 a1,a2,…,an(1≤ai≤100)——第一个数组的元素。
每个测试用例的第三行包含 n 个整数 b1,b2,…,bn(1≤bi≤100)——第二个数组的元素。
输出
对于每个测试用例,如果使用任意(可能为零)次操作后满足上述条件,则打印“Yes”。否则,打印“No”。
你可以以任何形式输出答案(大写或小写)。例如,字符串“yEs”、“yes”、“Yes”和“YES”将被识别为正面回应。
先上代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
bool check(vector<int> a, vector<int> b)
{
int max_a = *max_element(a.begin(), a.end()); // a 中的最大值
int max_b = *max_element(b.begin(), b.end()); // b 中的最大值
return (a[n - 1] == max_a && b[n - 1] == max_b);
}
int main() {
int t;
cin >> t;
while (t--) {
cin >> n;
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
bool ok = false;
for (int i = 0; i < n; ++i) {
int t1 = a[i], t2 = b[i];
a[i] = t2, b[i] = t1;
if (check(a, b)) {
ok = true;
break;
}
if (a[i] > a[n - 1] || b[i] > b[n - 1]) a[i] = t1, b[i] = t2;
}
if (ok) cout << "Yes\n";
else cout << "No\n";
}
return 0;
}
不出意外WA了
改进代码,成功AC
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n;
int main() {
int t;
cin >> t;
while (t--) {
cin >> n;
vector<int> a(n), b(n);
for (int i = 0; i < n; ++i) cin >> a[i];
for (int i = 0; i < n; ++i) cin >> b[i];
bool ok = false;
for (int i = 0; i < n; ++i) {
int t1 = a[i], t2 = b[i];
if (a[i] > a[n - 1] || b[i] > b[n - 1])
{
a[i] = t2, b[i] = t1;
}
if (a[i] > a[n - 1] || b[i] > b[n - 1])
{
a[i] = t1, b[i] = t2;
}
}
int max_a = *max_element(a.begin(), a.end()); // a 中的最大值
int max_b = *max_element(b.begin(), b.end()); // b 中的最大值
if (a[n - 1] == max_a && b[n - 1] == max_b) cout << "Yes\n";
else cout << "No\n";
}
return 0;
}