公司計劃面試 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。
思路
- 每人必去一個城市,只不過兩個城市之間有一個差價 costs[i][0]- costs[i][1]
- 重點來了,先讓他們都去B城市,總費用=sum(costs[i][1]),然後在挑一半去A,並補個差價給他們(costs[i][0]- costs[i][1]),你會選誰?
- 這是你會恍然大悟,呵呵,我當然要把差價小的一半人去A了,這便是我們的貪心策略
代碼:
- 算差價:dp[2N]保存差價,costs[i][0]- costs[i][1]
- 都去B:全部去B城市收取費用m
- 補差價:貪心的將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
看懂的話,幫我點贊,一起進步