1029. 兩地排程

小橋落花流水發表於2020-12-10

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


基本思路:貪心演算法,可以假設2N個人,先全部飛往A地,然後從A地挑選N個人飛往B地,令實際上飛往A地的人為x,代價為x_priceA,飛往B地的人為y,代價為y_priceB;

  • 總代價costs=x_priceA+y_pricewsB=(x_priceA+y_pricesA)+(y_priceB-y_priceA),等同於先全部飛往A地,再選N個人飛往B地,但是代價變為(y_priceB-y_priceA)
  • 前半部分是固定的,要想讓總代價最小,只需要選出前N個最小的(y_priceB-y_priceA)就行
    int twoCitySchedCost(vector<vector<int>>& costs) {
        sort(costs.begin(),costs.end(),[](vector<int> &l,vector<int> &r){
            return l[0]-l[1]<r[0]-r[1];
        });
        int ans=0;
        int len=costs.size()/2;
        for(int i=0;i<len;i++){
            ans+=(costs[i][0]+costs[i+len][1]);
        }
        return ans;
    }

擴充套件:

  •  如果不一定是偶數那,假設含有奇數,只需要對於第N+1個人z比較其飛往B地的代價,若大於零不飛,否則飛往B地

minnim

相關文章