题意:a数组n个数字给定,b数组m个数字中选出n个,与a数组对应差的绝对值和最大。
分析:如果b数组也是n个数字,那么a和b排序后,a最小匹配b最大(a1 bn),依次(a2 bn-1).。。。。。
现在b数组数量多过a数组,那么选取规则(贪心)就演变成b数组前面的k个数字和a数组后k个数字匹配。b数组后面n-k个数字和a数组前n-k个匹配。如图:
为求出这个合适的K值,需要枚举。下面代码先从k=n开始计算,当k为n-1时,原本abs(a1-bn)变为abs(a1-bm),依次类推。
#include <bits/stdc++.h>
using namespace std;
int n,m,a[200005],b[200005];
int main()
{
int t,i,j;
cin>>t;
while(t--)
{
cin>>n>>m;
for(i=1; i<=n; i++)
cin>>a[i];
sort(a+1,a+n+1);
for(i=1; i<=m; i++)
cin>>b[i];
sort(b+1,b+m+1);
long long ans=0,sum=0,l=1,r=m;
for(i=1; i<=n; i++)/**< 先选取b中前n个元素为初始值 */
sum+=abs(a[i]-b[n-i+1]);
ans=sum;
for(i=1;i<=n;i++)
{ /**< 递推求出b选取前n-i个元素*/
sum=sum-abs(a[i]-b[n-i+1])+abs(a[i]-b[m-i+1]);
ans=max(ans,sum);
}
cout<<ans<<endl;
}
return 0;
}