仓库选址

前提

a,b,x为数轴上三个点
绝对值不等式
|x-a|+|x-b|>=|a-b|
当x位于a,b之间的时候x到a,b的距离最短

仓库选址解决

在一条数轴上有 N 家商店,它们的坐标分别为A1 ∼AN。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。

  1. 将所有商店在数轴上的位置排序
  2. 将i,n-i+1的点配对
  3. 使用绝对值不等式
  4. 可以得出最小值点是n/2或者n/2+1的点

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#include<iostream>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<unordered_map>
#include <sstream>
#define FAST ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
using namespace std;

typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int> P;



const int N=1e6+100;
const ll mod=1e9+7;
const double PI=acos(-1.0);
const double E=2.718281828459045;

int a[N];

int main() {
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
int ans=0;
for(int i=0;i<n;i++){
ans+=abs(a[n/2]-a[i]);
}
printf("%d\n",ans);
return 0;
}