题目描述
在一条数轴上有 NN 家商店,它们的坐标分别为 A1A1∼ANAN。
现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。
为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
输入格式
第一行输入整数 NN。
第二行 NN个整数 A1A1∼ANAN。
输出格式
输出一个整数,表示距离之和的最小值。
样例
输入数据 1
4
6 2 9 1
输出数据 1
12
数据范围
1≤N≤1000001≤N≤100000
0≤Ai≤400000≤Ai≤40000
一。如果要找到一个点到各个点的距离之和最短,那么该点一定在距离远点最近和最远的区间之内。
假设三个点x1,x2,x,x到x1和x2的距离之和是|x-x1|+|x-x2|;
if(x<x1),距离之和是x1+x2-2x;
if(x>x2),距离之和是2x-x1-x2;
if(x1<x<x2),距离之和是x2-x1;
对于上面三种结果的分析,结果3就是x1,x2之间的距离,结果1中,(x2-x)>(x2-x1)前者再加上(x1-x)更大于结果3,同理分析结果2也能证明结果3是最小的。
综上,x的位置位于区间之内。
二。将数组进行排序后,从两端往中间推进,对于第一个和最后一个数,x的位置在它们中间,对于第二个数和倒数第二个数,也要保证x在它们之间,对于从前面和后面推进的一对数,x的位置都要在它们中间。如果该数组是奇数个那么就是中心那个数,如果是偶数,可以取中间两位数的其中一个。
综上所述,x的位置是a[n/2];
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
int min=0;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n);
for(int i=0;i<n;i++)
min+=fabs(a[i]-a[n/2]);
cout<<min;
return 0;
}