题目描述:给你两个长度为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; }