贪心思路:
取所有数的中位数则一定为地址则一定到其他货舱的距离小
证明
假设所有的坐标都已经按照从小到大排序了
x1最小 xn最大
设货舱的地址为x
则有f(x) = |x-x1| + |x-x2| + |x-x3| +····+|x-xn|
要使得这个函数取到最小值
则我们可以两两分组
f(x) = (|x-x1| + |x-xn|) + (|x-x2| + |x-xn-1|) ····
所以只要每一组取到最小值,那么f(x)一定取到最小值
第一组|x-x1| + |x-xn| 如何取到最小值
很显然应该x在x1和xn的内部 这样子这个值就是取到x1到xn的距离
如果x不在x1和xn的内部则这个值应该等于x1到xn的距离+d
第二组也是这个道理应该取x2到xn-1内部的一个x
因为我们排好序了,所以每一组都这样子取则x应该是这些数的一个中位数
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int main (){
cin >> n;
for (int i = 0;i < n;i++)
scanf ("%d" , &a[i]);
sort(a , a + n);
int res = 0;
int i = 0;
int j = n - 1;
for (;i < j;i++ , j--){
res += a[j] - a[i];
}
cout << res << endl;
return 0;
}