将所有的数据在数轴画出来,
将两两数据配对变的相等,也就是将图的任意一个点与且仅与另一个点相连。
变化次数就是连线长度。
求变化次数最少,也就是求所有线的总长度最小。
将相邻两个点相连,所得的总线段最短。
答案就是上述线段的总长度。
也就是将所有数据排序后, a2 - a1 + a4 - a3 + a6 - a5 + ....
(数组从 1 开始)
C++ 代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N];
int n;
int res;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
sort(a+1, a+1+n);
for (int i = 1; i <= n; i += 2 )
{
res += abs(a[i] - a[i + 1]);
}
cout << res;
return 0;
}
画图证明很直观,点赞了