[LeetCode] 1029. Two City Scheduling 兩個城市調度



A company is planning to interview 2n people. Given the array costs where costs[i] = [aCosti, bCosti], the cost of flying the ith person to city a is aCosti, and the cost of flying the ith person to city b is bCosti.

Return the minimum cost to fly every person to a city such that exactly n people arrive in each city.

Example 1:

Input: costs = [[10,20],[30,200],[400,50],[30,20]]
Output: 110
Explanation:
The first person goes to city A for a cost of 10.
The second person goes to city A for a cost of 30.
The third person goes to city B for a cost of 50.
The fourth person goes to city B for a cost of 20.

The total minimum cost is 10 + 30 + 50 + 20 = 110 to have half the people interviewing in each city.

Example 2:

Input: costs = [[259,770],[448,54],[926,667],[184,139],[840,118],[577,469]]
Output: 1859

Example 3:

Input: costs = [[515,563],[451,713],[537,709],[343,819],[855,779],[457,60],[650,359],[631,42]]
Output: 3086

Constraints:

  • 2 * n == costs.length
  • 2 <= costs.length <= 100
  • costs.length is even.
  • 1 <= aCosti, bCosti <= 1000

這道題說是一個公司要面試 2n 個人,每個人飛到城市A和城市B的花費不同,現在分別讓n個人去城市A和城市B面試,問最小的花費是多少。博主二話不說,上來就寫個遞歸的暴力搜索,遍歷所有的情況,但是很不幸的超時了,這道題需要更優化的解法。其實這道題可以用貪婪算法來做,首先假設我們讓所有的人都去城市A,那么總花費就是把所有人去城市A的花費加起來,但現在需要讓其中的一半人去城市B,由於花費不同了,怎么算呢?若去城市B的花費小於城市A的,則應該 refund 二者的差值,若去城市A的花費小於城市B的,則應該加上二者的差值。所以用去城市B的花費減去城市A的,若為負數,則是 refund,若為正數,則是追加的花費。當然是希望是負數,而且越小越好,這樣就可以 refund,使得整個花費變小。所以開始時遍歷一遍 costs 數組,將去城市A的花費先累加到結果 res 中,然后將去城市B的花費減去城市A的花費的差值存入 refund 數組,之后給 refund 數組排序,取出前n個值加到結果 res 中即可,參見代碼如下:


class Solution {
public:
    int twoCitySchedCost(vector<vector<int>>& costs) {
        int res = 0, n = costs.size() / 2;
        vector<int> refund;
        for (auto &cost : costs) {
            res += cost[0];
            refund.push_back(cost[1] - cost[0]);
        }
        sort(refund.begin(), refund.end());
        for (int i = 0; i < n; ++i) {
            res += refund[i];
        }
        return res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1029


參考資料:

https://leetcode.com/problems/two-city-scheduling/

https://leetcode.com/problems/two-city-scheduling/discuss/278716/C%2B%2B-O(n-log-n)-sort-by-savings

https://leetcode.com/problems/two-city-scheduling/discuss/667786/Java-or-C%2B%2B-or-Python3-or-With-detailed-explanation


LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM