算法分析基础上机题目
1.旅行商问题
【问题描述】
假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
【输入形式】
城市数目,以及城市之间的距离
【输出形式】
所有路径之中的最小值
【样例输入】
4
0,10,15,20
10,0,35,25
15,35,0,30
20,25,30,0
【样例输出】
80
【样例说明】
第一行说明有4个城市;第2至5行说明一个城市与其他城市的距离,其中城市到其自身的距离为0,不可达的城市之间的距离为0。
思路
数据较小,直接全排列枚举所有方案
代码
from itertools import permutations
n = int(input())
ls = []
for i in range(n):
ls.append([int(x) for x in input().split(',')])
def tsp(n, ls):
cities = [i for i in range(n)]
res = float('inf')
for path in permutations(cities):
distance = 0
for i in range(n):
distance += ls[path[i - 1]][path[i]]
res = min(res, distance)
return res
print(tsp(n, ls))
2.邮局选址问题
【问题描述】
对一个以XY轴表达的城市里,n个居民点散乱分布,居民点位置可以用坐标(x,y)表示,任意两点(x1,y1)(x2,y2)间距离可以用| x1-x1|+|y1-y2|度量,居民希望在城市中选择建立邮局的最佳位置,使得n个居民点到邮局的距离总和最小
【输入形式】
居民点数目,以及居民点的坐标
【输出形式】
最小的距离总和
【样例输入】
3
3 3
1 6
4 9
【样例输出】
9
思路
贪心的思想,首先这个问题可以将横纵坐标分开考虑,对答案没影响,则问题转换为在一维坐标轴上面选择一个点,使得所有点到它的距离加起来最小。
放到最中间距离最小,因为假设有两个点AB,需要放置C点,如下:
A C B
A B C
显然放中间距离为AB,放两边距离为AB+BC/AC
代码
n = int(input())
a, b = [], []
for i in range(n):
x, y = map(int, input().split())
a.append(x)
b.append(y)
## 排序
a.sort()
b.sort()
res = 0 ## 最优的选择就是放中间
for i in range(n):
res += abs(a[i] - a[n // 2]) + abs(b[i] - b[n // 2])
print(res)