问题描述:
公司计划面试 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
人去面试,共有A
、B
两个城市,每个城市去N
人,然后是达到花费最少。题目已经提示贪心算法。
(2)第一步,先不考虑去每个城市的人数,每次选择最优的城市去,即可(贪心思想),此时,并记录,如果去另外一个城市多出的花费。例如,去A
要10
,去B
要20
,那就现在优先考虑去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))
声明: 总结学习,有问题或不当之处,可以批评指正哦,谢谢。