这个题的大意为给定两组数据,第一组数据a长为n,第二组数据b长为m,且m >= n,让你从m中选出n个数使得这n个数 | ai-bi | 的值的总和最大,解析如下:
首先,先对两组数据分别进行排序,排完序后可以想到,a组的第一个数据一定会与b组的最后一个数据结合,a组的最后一个数据一定会与b组的第一个数据结合,我们可以对这两种情况进行贪心处理,观察这两种情况,哪种最大取哪一种,代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void solve()
{
int n,m;
cin >> n >> m;
vector<int> a(n+2);
vector<int> b(m+2);
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
for(int i = 0; i < m; i++) scanf("%d",&b[i]);
sort(a.begin(), a.begin() + n);
sort(b.begin(), b.begin() + m);
int x = 0, y = n-1;
int l = 0, r = m - 1;
long long ans = 0;
while(x <= y)
{
if(abs(a[x] - b[r]) > abs(a[y] - b[l]))
{
ans += abs(a[x] - b[r]);
//重新定义开头结尾
x++;
r--;
}
else
{
ans += abs(a[y] - b[l]);
//重新定义开头结尾
y--;
l++;
}
}
cout << ans << endl;
}
int main()
{
int t;
cin >> t;
while(t--)
{
solve();
}
return 0;
}
另一种写法:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e5+10;
int a[N], b[N];
int main()
{
int t;
cin >> t;
while(t--)
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; i++)cin >> a[i];
for(int i = 1; i <= m; i++) cin >> b[i];
sort(a+1, a+1+n);
sort(b+1, b+1+m,greater<int>());
long long ans = 0;
for(int i = 1; i <= n; i++)
ans += max(abs(a[i] - b[i]), abs(a[i] - b[m-n+i]));
cout << ans << endl;
memset(a,0,sizeof a);
memset(b, 0,sizeof b);
}
return 0;
}