LeetCode:1029. Two City Scheduling - Python

189 篇文章 3 订阅
151 篇文章 2 订阅
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 <= costs.length <= 100
  • costs.length 为偶数
  • 1 <= costs[i][0], costs[i][1] <= 1000

问题分析:

(1)先理解题目,就是有2N人去面试,共有AB两个城市,每个城市去N人,然后是达到花费最少。题目已经提示贪心算法

(2)第一步,先不考虑去每个城市的人数,每次选择最优的城市去,即可(贪心思想),此时,并记录,如果去另外一个城市多出的花费。例如,去A10,去B20,那就现在优先考虑去A,然后开辟一个数组,记录此时如果去B差价,很显然是10

(3)现在开始分析,是不是两个城市都去了N人,如去A城市的人多了,说明要从中选取多余的人改去B城市,现在怎么选择哪?利用之前记录的差价,进行排序,依次从最小的开始进行改去B市,其中这也是贪心思想。同理,去B市的人多了,就选择一部去A市。

Python3实现:

class Solution():
    def twoCitySchedCost(self, costs):

        N = len(costs)//2
        ans = 0
        diffa, diffb = [], []

        for cost in costs:  # 贪心思想,进行处理
            if cost[0] < cost[1]:  # 去A城市
                ans += cost[0]     # 记录总的花费
                diffb.append(cost[1]-cost[0])  # 并记录如果去B城市,多花的钱,保存到 diffb
            else:                 # 同理,去B城市 ...
                ans += cost[1]
                diffa.append(cost[0]-cost[1])

        if len(diffa) < len(diffb):  # 分配到A城市的人多,则,从B里面,根据最优原则,选出几人,去B城市
            diffb.sort()
            for j in range(len(diffb)-N):
                ans += diffb[j]

        if len(diffa) > len(diffb):  # 同理,分配到B城市的人多 ...
            diffa.sort()
            for i in range(len(diffa)-N):
                ans += diffa[i]

        return ans


if __name__ == '__main__':
    solu = Solution()
    costs = [[10, 20], [30, 200], [400, 50], [30, 20]]
    print(solu.twoCitySchedCost(costs))

声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。

题目链接参考链接

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值