思路:这道题是让找一个位置X,使得从该位置出发,X到每个仓库的距离之和最小。经讨论知道这个位置选在中间部分最好,因为选择两边必然会多走部分路程。当奇数个货仓,就选中最中间的仓库为位置X。当偶数个仓库,就选中间两个仓库的中间位置为X。
AC代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
int n;
long long summ=0;
int mid ;
int main()
{
scanf("%d",&n);
int a[n];//存仓库位置
//以某一个仓库为起点
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
if(n%2==1){
//奇数个
mid = a[n/2];
}
else {
mid = (a[n/2] + a[n/2 - 1])/2;
}
for(int i=0;i<n;i++){
summ+=abs(a[i] - mid);
}
printf("%lld",summ);
return 0;
}