題目大意
有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;
}
};
總結
比較巧妙的貪心題目。