对数组a和b进行排序
为了尽可能满足条件,一定是把数组a的较大的值与数组b中较小的值进行配对,数组a中较小的值与数组b中较大的值进行配对。
因此排序之后,按照上述方式去检查每一个位置i是否满足条件即可
O(nlogn)
C++
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[505], b[505];
void solve() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
scanf("%d", a + i);
}
for (int i = 1; i <= n; i++) {
scanf("%d", b + i);
}
sort(a + 1, a + 1 + n);
sort(b + 1, b + 1 + n);
for (int i = 1; i <= n; i++) {
if (a[i] + b[n - i + 1] > m || a[i] + b[n - i + 1] < 1) {
puts("No");
return;
}
}
puts("Yes");
}
int main() {
int t = 1;
cin >> t;
while (t--) solve();
return 0;
}
python代码
q = int(input())
for _ in range(q):
n, m = [int(i) for i in input().split()]
nums1 = [int(i) for i in input().split()]
nums2 = [int(i) for i in input().split()]
nums1.sort()
nums2.sort(reverse=True)
for i in range(n):
if not( 1 <= nums1[i] + nums2[i] <= m ):
print("No")
break
else:
print("Yes")
Java代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int q = in.nextInt();
while(q-- > 0){
int n = in.nextInt();
int m = in.nextInt();
int[] a = new int[n], b = new int[n];
for (int i = 0; i < n; i++) {
a[i] = in.nextInt();
}
for (int i = 0; i < n; i++) {
b[i] = in.nextInt();
}
Arrays.sort(a);
Arrays.sort(b);
boolean flag = true;
for (int i = 0; i < n; i++) {
int cur = a[i] + b[n - i - 1];
if(cur > m || cur < 1){
flag = false;
break;
}
}
System.out.println(flag ? "Yes" : "No");
}
}
}
q次询问,每次给定两个数组a,b , 问你是否存在一种排列情况使得重排数组a,b 之后每个i∈[1,n] 都能满足1≤ai+bi≤m
第一行输入一个整数q(1≤q≤30)
接下来q组,对于每组:
第一行两个整数n(1≤n≤500),m(1≤m≤500)
第二行n个整数a1,a2,...,an
第二行n个整数b1,b2,...,bn
−500≤ai,bi≤500
输出q行,每一行如果能够满足条件,输出一个"Yes" ,否则输出"No" (不含双引号)
输入
2
5 3
-1 -2 3 4 5
-1 3 4 2 5
5 6
-1 -2 3 4 5
-1 3 4 2 5
输出
No
Yes