AC代码:
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int N = 100010;
int main(){
int n,arr[N]; ///n--点的数目;arr--各个点的坐标
cin>>n;
for(int i=0;i<n;++i){
cin>>arr[i];
}
sort(arr,arr+n);
int ans=0,m=n/2; ///求中位数的坐标
for(int i=0;i<n;++i){
ans+=fabs(arr[i]-arr[m]);
}
cout<<ans<<endl;
return 0;
}
思路:
常见模型,利用了数学结论:奇数个选中位数、偶数个选中间两个的任意一个既是最优解
推导过程:将n个点,按1和n、2和n-1。。。以此类推分组,对于其中每一组,都应该选两点中间的点作为仓库才能使距离和最小,故推导出选中位数的结论
相关题目:
扩展到二维:3167.星星还是树