兩地調度之超易懂的貪心算法問題

公司計劃面試 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。

思路

  1. 每人必去一個城市,只不過兩個城市之間有一個差價 costs[i][0]- costs[i][1]
  2. 重點來了,先讓他們都去B城市,總費用=sum(costs[i][1]),然後在挑一半去A,並補個差價給他們(costs[i][0]- costs[i][1]),你會選誰?
  3. 這是你會恍然大悟,呵呵,我當然要把差價小的一半人去A了,這便是我們的貪心策略

代碼:

  1. 算差價:dp[2N]保存差價,costs[i][0]- costs[i][1]
  2. 都去B:全部去B城市收取費用m
  3. 補差價:貪心的將m在加上N個dp[2N]中較小值
class Solution:
    def twoCitySchedCost(self, costs: List[List[int]]) -> int:
        dp=[0]*len(costs)
        k,m=0,0
        #i 是去A的價格,j是去B的價格
        for i,j in costs:
       		 #算差價
            dp[k]=i-j
            k+=1
            #全去B的費用
            m+=j
        dp.sort()
        #一半去A並補上差價
        for i in range(int(len(costs)/2)):
            m+=dp[i]
        return m
        

看懂的話,幫我點贊,一起進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章