【力扣】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,每个城市都有一半的人在面试。

算法思路

因为要求每个城市都有N个人,所以不能无脑选择最低费用去某城市,当一边人满后不得已只能去另一个城市。

那么最开始可以自由选择去A或B时,是凭借什么做的选择呢?
假如只有两个人,甲去A:10元,去B:20元;选择去A,乙去A:100元,去B:10000元,此时乙不得已只能去B,显然这是不对的。

其实我们起码模糊感觉得到,选择A或B,应该从最大差值开始确定,

class Solution:
    def twoCitySchedCost(self, costs: List[List[int]]) -> int:
        f=lambda x:abs(x[0]-x[1])
        costs=sorted(costs,key=f,reverse=True)
        res=0
        a=b=len(costs)//2
        for i in costs:
            if b and i[0]>i[1]:
                res+=i[1]
                b-=1
            elif a and i[0]<i[1]:
                res+=i[0]
                a-=1
            elif not a and b:
                res+=i[1]
                b-=1
            else:
                res+=i[0]
                a-=1
        return res

执行用时 :52 ms, 在所有 Python3 提交中击败了59.02%的用户
内存消耗 :13.6 MB, 在所有 Python3 提交中击败了25.00%的用户

你可能感兴趣的:(力扣日记)