LeetCode Daily challenge - Two City Scheduling

題目大意

有2N個人,現將這2N個人送到A, B兩個城市,每個人送到不同城市的代價爲costs。計算將這2N個人送到不同城市的最小代價,要求每個城市剛好送N個人。

思路

乍一看有點像動態規劃,但是思考後發現有一定的貪心策略在裏面。實際上,去A的代價與去B的代價 cost[a] - cost[b] 代表讓一個人去B能夠節約的錢,反之,cost[b] - cost[a] 代表一個人去A能夠節約的錢。而這兩組數互爲相反數。所以只需計算一組然後選前N個去A,後N個去B。

優化,計算所有的差值之後,只要選前N個小的就行,所以可以用nth_element

我的方法

先把每個人的代價中最小的加起來,得到總代價sum,當然這個時候去A的人數acount與去B的人數bcount不相等。不妨假設acount > bcount,則需要將去A的一些人安排到B。這個時候使用上述同樣的方法,將去A的人數中cost[b] - cost[a]最小的幾個人安排到B即可。

代碼


class Solution {
public:
    int twoCitySchedCost(vector<vector<int>>& costs) {
        const int n = costs.size() / 2;
        priority_queue<int, vector<int>, greater<int>> q;
        int acount = 0, bcount = 0, sum = 0;
        for (const auto &tmpvec: costs) {
            sum += min(tmpvec[0], tmpvec[1]);
            if (tmpvec[0] < tmpvec[1]) acount++;
            else bcount++;
        }
        for (const auto &tmpvec: costs){
            if (acount > bcount && tmpvec[0] < tmpvec[1]) 
                q.push(tmpvec[1] - tmpvec[0]);
            else if (acount < bcount && tmpvec[1] <= tmpvec[0])
                q.push(tmpvec[0] - tmpvec[1]);
        }
        for (int i = 0; i < max(acount, bcount) - n; i++) {
            sum += q.top();
            q.pop();
        }
        return sum;
    }
};

總結

比較巧妙的貪心題目。

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