抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

原题链接

题目:

在一条数轴上有 N 家商店,它们的坐标分别为 A1∼AN。

现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。

为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。

输入格式

第一行输入整数 N。

第二行 N 个整数 A1∼ AN

输出格式

输出一个整数,表示距离之和的最小值。

数据范围

$1≤N≤1000001≤N≤100000$
$0 ≤ Ai ≤ 400000 ≤ Ai ≤ 40000$

输入样例:

1
2
4
6 2 9 1

输出样例:

1
12

解题思路:

那面如何选择中位数仓库x如果当n等于奇数那么中间的数就是中位数,如果n是偶数那么现在中间两个其实一都可以。

首先考虑在坐标轴上建立仓库$x$如图 假设货仓在中间可得$|a - x| + |b - x| >= |a - b|$,$|a - x|$就是a 到 x的距离 同理 $|b - x|、 |a - b|$

image-20210313183410812

如果货仓在最左侧或者最右侧情况,那么可以看出$|x - a|$的距离就走了两遍所有放在中间才是最优解。

image-20210313184406768

第一种做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <math.h>
#include <algorithm>

#define MAX_N 100000

int f[MAX_N + 10];

int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", f + i);
}
std::sort(f, f + n);
int res = 0;
for (int i = 0; i < n; i++) {
res += abs(f[i] - f[n >> 1]);
}
printf("%d\n", res);
return 0;
}

评论