參考:https://blog.csdn.net/qq_25245961/article/details/77522141
描述
一個街區有很多住戶,街區的街道只能爲東西、南北兩種方向。
住戶只可以沿着街道行走。
各個街道之間的間隔相等。
用(x,y)來表示住戶坐在的街區。
例如(4,20),表示用戶在東西方向第4個街道,南北方向第20個街道。
現在要建一個郵局,使得各個住戶到郵局的距離之和最少。
求現在這個郵局應該建在那個地方使得所有住戶距離之和最小;
輸入
第一行一個整數n<20,表示有n組測試數據,下面是n組數據;
每組第一行一個整數m<20,表示本組有m個住戶,下面的m行每行有兩個整數0 < x,y < 100,表示某個用戶所在街區的座標。
m行後是新一組的數據;
輸出
每組數據輸出到郵局最小的距離和,回車結束;
這個題目的特點是要對蠻力法進行優化。
算法思想:
可以先對x軸進行遍歷,從1到100的每個橫座標點到輸入點(x,y)的橫座標的距離和的最小值記爲xmin;
同理,然後對y軸進行遍歷,從1到100的每個縱座標點到輸入點(x,y)的縱座標的距離和的最小值記爲ymin;
求sum = xmin + ymin即爲最小距離和。
算法複雜度:O(m*n),循環次數最多爲100*20。
n = input('請輸入組數<20:')
n = int(n)
biglist = []
for _ in range(n):
xmin = 2 ** 32
ymin = 2 ** 32
sums = 2 ** 32
sublist = []
m = input('請輸入座標組數<100:')
m = int(m)
for _ in range(m):
sublist.append(list(map(int, input().strip().split()[:2])))
print(sublist[0]) # [1, 2]
i=1
for i in range(101):
if xmin>sums:
xmin = sums
sums = 0
k = 0
while k<m:
sums += abs(i-sublist[k][0])
k += 1
print('x軸方向最小和:',xmin)
sums = 2**32
j = 1
for j in range(101):
if ymin > sums:
ymin = sums
sums = 0
k = 0
while k < m:
sums += abs(j - sublist[k][1])
k += 1
print('y軸方向最小和:', ymin)
print('最小距離和是:',xmin+ymin)
.