1.9 货仓选址问题——Python

题目描述

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

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

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

输入格式

第一行输入整数N。

第二行N个整数A1~AN。

输出格式

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

数据范围

1≤N≤100000,
0≤Ai≤40000

输入样例

4
6 2 9 1

输出样例

12

题目分析

这是一道非常基础的算法题,要求一个货仓到每家商店的最短距离,我的思路如下:

1. 我们要找一个仓库,他们在一条路线上

2. 如果是二维的,我们就要一个一个进行判断计算,因为他要求所有的最短距离。但是这道题是一维,所以首先需要求出货仓的坐标

3. 不难分析,当货仓处于所有商店最中间的位置时,到每家商户的距离将会最近,即货仓处于的位置应该是商店坐标的中位数。

       假设区间[a,b]的距离;是n那么如果货仓x选在区间[a,b]的任一位置的话,s=n;如果选在区间[a,b]之外的话,s>n。 因此货仓应选在两个点之间,推广到n个商店的情况的话,货仓应该选在最中间的两个点之间,此时的s-定是最小的(可以用反证法证明)。当商店个数是奇数时,中位数只有一个; 当个数是偶数时,中位数有两个,此时可以取两个中位数的平均值,或是直接取整**

4. 确定了货仓的坐标之后,就可以通过将货仓的坐标和每个商店的坐标相减取绝对值再加和,得到货仓到每家商店的最短距离

源代码

 1 # import numpy as np
 2 
 3 n = int(input())
 4 # 两种输入方式
 5 # nums = list(map(int, input().split()))
 6 arr = input("")
 7 nums = [int(i) for i in arr.split()]
 8 
 9 # 对输入的数组进行排序
10 nums.sort()
11 
12 # 两种求中位数方式
13 address = nums[n >> 1]
14 # address = np.median(nums)
15 
16 res = 0
17 for num in nums:
18     res += abs(num - address)
19 print(res)

注意问题

1.  一维数组的输入方式:

nums = list(map(int, input().split()))

或者是:

arr = input("")
nums = [int(i) for i in arr.split()]

 2. 求中位数的方式:

① 可以通过导入numpy包,引用其中的median()函数直接求得中位数。

import numpy as np

nums = [6, 5, 8, 2]
address = np.median(nums)

② 也可以通过移位运算符: >> ,移位运算符针对二进制数进行左移或右移,即移动的单位是二的幂次方。假设 n = 8,其二进制为 0000 1000 ,则 n >> 1为 n 向右移2^1,即 0000 0100,此时得到的结果是4,可以直接取得中位数。

address = nums[n >> 1]
posted @ 2021-01-11 12:20  张涨涨  阅读(501)  评论(0编辑  收藏  举报
Live2D