题目:
在一条数轴上有 N家商店,它们的坐标分别为 A1∼AN。
现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。
为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。输入格式第一行输入整数 N。第二行 N个整数 A1∼AN。输出格式
输出一个整数,表示距离之和的最小值。
贪心
我们可以先对坐标进行排序,然后选择其中位数作为货仓的位置。因为如果货仓不在中位数位置,那么移动货仓到中位数位置一定会使距离之和更小。
具体地,设坐标从小到大排序后为B1,B2,…,BN,那么中位数的位置为B[(N+1)/2]。我们把货仓建在这个位置,然后计算货仓到每个商店的距离之和即可。
时间复杂度:排序的复杂度为O(NlogN),加上计算距离的复杂度O(N),总时间复杂度为O(NlogN)。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] shops = new int[n];
for (int i = 0; i < n; i++) {
shops[i] = scanner.nextInt();
}
Arrays.sort(shops);
int warehouse = shops[(n - 1) / 2];
int distanceSum = 0;
for (int shop : shops) {
distanceSum += Math.abs(shop - warehouse);
}
System.out.println(distanceSum);
}
}