1 9 貨倉選址問題 Python

2022-07-07 20:24:13 字數 1870 閱讀 3329

在一條數軸上有 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

23 n =int(input())4#

兩種輸入方式5#

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

6 arr = input(""

)7 nums = [int(i) for i in

arr.split()]89

#對輸入的陣列進行排序

10nums.sort()

1112

#兩種求中位數方式

13 address = nums[n >> 1]14#

address = np.median(nums)

1516 res =0

17for num in

nums:

18 res += abs(num -address)

19print(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]

貨倉選址問題

筆記在一條數軸上有 n 家商店,它們的座標分別為 a1 an。現在需要在數軸上建立一家貨倉,每天清晨,從貨倉到每家商店都要運送一車商品。為了提高效率,求把貨倉建在何處,可以使得貨倉到每家商店的距離之和最小。輸入格式 第一行輸入整數n。第二行n個整數a1 an。輸出格式 輸出乙個整數,表示距離之和的最...

演算法題 貨倉選址(Python)

在一條數軸上有 n 家商店,它們的座標分別為 a1 an。現在需要在數軸上建立一家貨倉,每天清晨,從貨倉到每家商店都要運送一車商品。為了提高效率,求把貨倉建在何處,可以使得貨倉到每家商店的距離之和最小。輸入格式 第一行輸入整數n。第二行n個整數a1 an。輸出格式 輸出乙個整數,表示距離之和的最小值...

貨倉選址(貪心)

題目鏈結 在一條數軸上有 n 家商店,它們的座標分別為 a1 an。現在需要在數軸上建立一家貨倉,每天清晨,從貨倉到每家商店都要運送一車商品。為了提高效率,求把貨倉建在何處,可以使得貨倉到每家商店的距離之和最小。輸入格式 第一行輸入整數n。第二行n個整數a1 an。輸出格式 輸出乙個整數,表示距離之...