题目描述
公司计划面试 2n 人,并需要将每个人分配到两个城市中的一个。每个人飞往城市 A 或城市 B 的费用不同,具体体现在数组 costs 中,其中 costs[i] = [aCosti, bCosti] 代表第 i 个人飞往城市 A 和城市 B 的费用。你需要帮助公司计算将 2n 个人分配到两个城市的最低费用,要求每个城市都有 n 个人到达。
测试样例
样例1:
输入:
costs = [[10,20],[30,20],[40,50],[30,20]]
输出:90
样例2:
输入:
costs = [[59,77],[48,54],[96,66],[18,19]]
输出:192
样例3:
输入:
costs = [[15,53],[41,73],[57,79],[34,89]]
输出:201
解答
这个问题可以通过贪心算法来解决。我们需要将 2n 个人分配到两个城市,确保每个城市都有 n 个人到达,并且总费用最低。可以按以下步骤进行:
- 计算每个人的成本差:对于每个人,计算他们飞往城市 A 和城市 B 的费用差,定义为
costs[i][0] - costs[i][1]。这个差值反映了选择城市 A 相对于城市 B 的相对优势。 - 排序:根据每个人的费用差对所有人进行排序。费用差小的人选择城市 A 的优势更大,而费用差大的则选择城市 B 的优势更大。
- 分配城市:选择前 n 个费用差最小的人分配到城市 A,剩下的 n 个人分配到城市 B。
- 计算总费用:计算选择的城市 A 和城市 B 的总费用。
下面是用 Python 实现的代码:
def twoCitySchedCost(costs):
# 按照费用差进行排序
costs.sort(key=lambda x: x[0] - x[1])
total_cost = 0
n = len(costs) // 2
# 前 n 个人分配到城市 A,后 n 个分配到城市 B
for i in range(n):
total_cost += costs[i][0] # 城市 A 的费用
for i in range(n, 2 * n):
total_cost += costs[i][1] # 城市 B 的费用
return total_cost
# 示例使用
costs = [[10, 20], [30, 200], [50, 30], [200, 50]]
result = twoCitySchedCost(costs)
print(result) # 输出最低费用
代码解析
-
排序:使用
sort函数按照costs[i][0] - costs[i][1]排序,确保费用差小的人在前面,这样选择城市 A 的成本更低。 -
分配城市:
- 前 n 个元素的费用加到
total_cost中,表示分配到城市 A 的费用。 - 后 n 个元素的费用加到
total_cost中,表示分配到城市 B 的费用。
- 前 n 个元素的费用加到
-
返回结果:最终返回计算得到的总费用。
尾言
这道题目我最初的想法是使用动态规划,但是仔细分析题目条件,其实使用贪心算法就可以解决,还是有所收获的。