题目描述
在一条数轴上有 NN 家商店,它们的坐标分别为 A_1A1∼A_NAN。
现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。
为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
输入格式
第一行输入整数 NN。
第二行 NN个整数 A_1A1∼A_NAN。
输出格式
输出一个整数,表示距离之和的最小值。
样例
输入数据 1
4
6 2 9 1
输出数据 1
12
数据范围
1≤N≤1000001≤N≤100000
0≤A_i≤400000≤Ai≤40000
思路分析
1首先题目要求求出从所选结点到各个商店的路径和,由此可以分析该点一定在最远的最近的点所连成的区间之内
2同理可得,该点也在倒数第二远和倒数第二近的点的区间内
3因此可以知道:对于偶数来说,总路程就等于最远最近的区间大小+倒数第二远近点区间大小+················以此类推。对于奇数来说,其实所选的点就是中心点,也就是排序之后得到位于中间位置的点,由此就可以得到代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int res=0;
int a[100050];
int g[100050];
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
if(n%2==0){
for(int j=1;j<=n/2;j++){
g[j]=a[n-j+1]-a[j];
}
for(int z=1;z<=n/2;z++){
res+=g[z];
}
}
else{
for(int j=1;j<=(int)n/2;j++){
g[j]=a[n-j+1]-a[j];
}
g[(int)n/2+1]=0;
for(int z=1;z<=int(n/2)+1;z++){
res+=g[z];
}
}
cout<<res;
return 0;
}