题目描述
给定两个数组 a 和 b,每个数组中都包含 n 个正整数。
再给定一个整数 x。
请你判断,能否通过重新排列 b 中的元素,使得 ai+bi≤x 对于每个 i(1≤i≤n)成立。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含两个整数 n 和 x。
第二行包含 n 个整数 a1,a2,…,an。
第三行包含 n 个整数 b1,b2,…,bn。
注意,两个数组内的元素都是以非降序的顺序给出。
每组数据之间,用空行隔开。
输出格式
每组数据输出一行结果,如果能够通过重新排列 b 中的元素,使得 ai+bi≤x 对于每个 i(1≤i≤n)成立,则输出 Yes,否则输出 No。
数据范围
1≤T≤100,
1≤n≤50,
1≤x≤1000,
1≤a1≤a2≤…≤an≤x,
1≤b1≤b2≤…≤bn≤x
输入样例:
4
3 4
1 2 3
1 1 2
2 6
1 4
2 5
4 4
1 2 3 4
1 2 3 4
1 5
5
5
输出样例:
Yes
Yes
No
No
算法
把数组b从大到小排序,两个数组挨个加起来与x比较
起初想得太简单了,以为比较一下数组前两位和后两位就行了
代码写得很随意
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n, x;
const int N = 110;
int a[N], b[N];
int main()
{
int T;
cin >> T;
while (T--)
{
cin >> n >> x;
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) cin >> b[i];
sort(b, b + n, greater<int>()); //从大到小(降序)排序
int ans = 0;
for (int i = 0; i < n; i++)
{
if (a[i] + b[i] > x)
{
ans = 1;
break;
}
}
if (ans == 0)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}