题目描述
在一条数轴上有N家商店,它们的坐标分别为 A[1]~A[N]。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。
输入描述:
第一行一个整数N,第二行N个整数A[1]~A[N]。
输出描述:
一个整数,表示距离之和的最小值。
示例1
输入
4 6 2 9 1
输出
12
备注:
对于100%的数据:N≤100000, A[i]≤1000000
为了解决这个问题,可以使用中位数属性来找到距离之和最小的货仓位置。因为每次运送都要计算到每个商店的距离,而这些距离是关于货仓位置对称的,所以当货仓位于所有商店坐标的中位数时,到最远端商店的距离之和会最小。
以下是C++代码实现:
Cpp
1#include <iostream>
2#include <vector>
3#include <algorithm>
4
5using namespace std;
6
7int main() {
8 int N;
9 cin >> N;
10
11 vector<int> A(N);
12 for (int i = 0; i < N; ++i) {
13 cin >> A[i];
14 }
15
16 // 对商店坐标进行排序
17 sort(A.begin(), A.end());
18
19 // 计算中位数
20 int median;
21 if (N % 2 == 0) { // 如果商店数量为偶数
22 median = (A[N / 2 - 1] + A[N / 2]) / 2;
23 } else { // 商店数量为奇数
24 median = A[N / 2];
25 }
26
27 long long totalDistance = 0;
28 for (int shop : A) {
29 totalDistance += abs(shop - median);
30 }
31
32 cout << totalDistance << endl;
33
34 return 0;
35}
这段代码首先读取商店的数量以及各个商店的坐标,并将它们存储在一个向量(数组)中。然后,它对商店坐标进行排序,并计算中位数。最后,遍历所有商店,计算与中位数之间的绝对差值(即距离),累加得到总距离之和,并输出结果。