一,思路:这题是一道简单的贪心题目。只需要我们排完序之后用双指针来实现最大值的对映上最小值,取出差值最大的那个一对,指针移动。
二,代码:
#include <iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=2e5+10;
typedef long long ll;
typedef pair<int,int> pii;
ll arr[N],brr[N];
void Solved() {
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>arr[i];
for(int i=1;i<=m;i++) cin>>brr[i];
sort(arr+1,arr+1+n);
sort(brr+1,brr+1+m);
ll sum=0;
//定义四个指针分别对应两个数组排序后的首尾元素。
int l=1,r=m,l1=1,r1=n;
while(l1<=r1){
//比较出差值最大的那一对,指针移动
if(brr[r]-arr[l1]>arr[r1]-brr[l]) sum+=abs(arr[l1++]-brr[r--]);
else sum+=abs(arr[r1--]-brr[l++]);
}
cout<<sum<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin>>t;
while(t--) {
Solved();
}
return 0;
}