参考: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)
.