题目描述:给你两个长度为n的数组a、b,让你重组b使得任意i都有ai+bi<=x
问能不能求得这样一个b,能Yes不能No
贪心:给最大的ai以最小的bi,次大对次小,以此类推。
按上述贪心构建好之后,发现交换b中的任意两个数,都会让其中至少一个ai+bi变大,所以这个贪心是最优的。
按贪心构造完之后检验即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100010],b[100010];
ll n,x,t;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n>>x;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) {cin>>b[i];b[i]=-b[i];}
sort(a+1,a+1+n); sort(b+1,b+1+n);
for(int i=1;i<=n;++i) b[i]=-b[i];
int flag=1;
for(int i=1;i<=n;++i)
{
if(a[i]+b[i]>x) {flag=0;break;}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}


京公网安备 11010502036488号