面试公司人员城市分配 | 豆包MarsCode AI刷题

118 阅读2分钟

题目描述

公司计划面试 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 个人到达,并且总费用最低。可以按以下步骤进行:

  1. 计算每个人的成本差:对于每个人,计算他们飞往城市 A 和城市 B 的费用差,定义为 costs[i][0] - costs[i][1]。这个差值反映了选择城市 A 相对于城市 B 的相对优势。
  2. 排序:根据每个人的费用差对所有人进行排序。费用差小的人选择城市 A 的优势更大,而费用差大的则选择城市 B 的优势更大。
  3. 分配城市:选择前 n 个费用差最小的人分配到城市 A,剩下的 n 个人分配到城市 B。
  4. 计算总费用:计算选择的城市 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)  # 输出最低费用

代码解析

  1. 排序:使用 sort 函数按照 costs[i][0] - costs[i][1] 排序,确保费用差小的人在前面,这样选择城市 A 的成本更低。

  2. 分配城市

    • 前 n 个元素的费用加到 total_cost 中,表示分配到城市 A 的费用。
    • 后 n 个元素的费用加到 total_cost 中,表示分配到城市 B 的费用。
  3. 返回结果:最终返回计算得到的总费用。

尾言

这道题目我最初的想法是使用动态规划,但是仔细分析题目条件,其实使用贪心算法就可以解决,还是有所收获的。