题目思路
本题中考虑到需要使用最小的修改可以实现所有的整数配对,故实际上最优解一定是将某个数字a[i]
修改为离他最近的一个数字a[j]
。
我们可以将排序好的所有数字放到一个数轴上,就可以看到下面的情况
为了使得我们的修改量最少,即数轴上每个点找到和他配对的一个点所需移动的总距离最小,此时我们需要尽量少地越过其他的点,故可以证明对于每个a[i]
都必须找其相邻的点进行配对。
假设我们使用蓝色的方法进行配对,此时a[1]
必须越过a[2]
和a[3]
寻找与其配对的点,此时并非最小。
同样对于后面的每一个点均适用于该种情况。
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; ++i) cin >> a[i];
sort(a + 1, a + n + 1);
int res = 0;
for (int i = 1; i <= n; i += 2)
{
res += abs(a[i + 1] - a[i]);
}
cout << res;
}