LeetCode 1029. 两地调度

公司计划面试 2N 人。第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]

返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵达

示例:

输入:[[10,20],[30,200],[400,50],[30,20]]
输出:110
解释:
第一个人去 A 市,费用为 10。
第二个人去 A 市,费用为 30。
第三个人去 B 市,费用为 50。
第四个人去 B 市,费用为 20。

最低总费用为 10 + 30 + 50 + 20 = 110,每个城市都有一半的人在面试。

提示:

  1. 1 <= costs.length <= 100
  2. costs.length 为偶数
  3. 1 <= costs[i][0], costs[i][1] <= 1000

方法一:把costs任意分成A、B两个列表,每个长度为N,表示A集合去A地、B集合去B地。对于A集合中每个人,到B集合中遍历 看是否能互换位置,让总费用更低 

class Solution:
    def twoCitySchedCost(self, costs: List[List[int]]) -> int:
        A = costs[:len(costs)//2]
        B = costs[len(costs)//2:]      
        for i in range(len(A)):
            for j in range(len(B)):
                if A[i][1] + B[j][0] < A[i][0] + B[j][1]:
                    A[i], B[j] = B[j], A[i]      
        ret = 0
        for a in A:
            ret += a[0]
        for b in B:
            ret += b[1]
        return ret
        '''        

方法二:把2N个人费用排序,让到B地比到A地的差价大的人排在前面,最后让前N个人去A地,后N个人去B地

class Solution:
    def twoCitySchedCost(self, costs: List[List[int]]) -> int:
        costs.sort(key = lambda cost:cost[1]-cost[0],reverse = True)
        ret = 0
        ret += sum(costs[i][0] for i in range(len(costs)//2))
        ret += sum(costs[i][1] for i in range(len(costs)//2, len(costs)))
        return ret

猜你喜欢

转载自blog.csdn.net/a906958671/article/details/89513817