一看题目,就知道这道题肯定是贪心。
我们先把数组 a
、b
按从小到大的顺序排序。
之后,肯定是用 b
的最大的几个数和 a
最小的几个数相减,用 b
的最小的几个数和 a
最大的几个数相减。
但究竟把哪一个数作为折点呢?
枚举 a
数组的每一个数,尝试把这个数当作折点。即在这个数前(包括这个数),用 b[j]
减去 a[j]
;这个数之后的数,用 a[j]
减去 b[j]
。
用一个数记录最大值,每次循环都更新一次。
代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,a[100010],b[100010];
void solve(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
sort(a+1,a+n+1);
sort(b+1,b+n+1); // 排序
int ans=0;
for(int i=1;i<=n;i++){ // 枚举折点
int tmp=INT_MAX;
for(int j=1;j<=i;j++)
tmp=min(tmp,abs(a[j]-b[n-i+j]));
for(int j=i+1;j<=n;j++)
tmp=min(tmp,abs(a[j]-b[j-i]));
ans=max(ans,tmp);
}
cout<<ans<<endl;
}
signed main(){
cin>>t;
while(t--)
solve();
return 0;
}