1 题目
There are 2N
people a company is planning to interview. The cost of flying the i
-th person to city A
is costs[i][0]
, and the cost of flying the i
-th person to city B
is costs[i][1]
.
Return the minimum cost to fly every person to a city such that exactly N
people arrive in each city.
Example 1:
Input: [[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.
2 尝试解
2.1 分析
2N个人,一半去A城,一半去B城,第i个人去A城的成本为cost[i][0],去B城的成本为cost[i][1],问怎样分配能使总成本最低。
先把所有人都放到A城,总成本total_cost = sum(cost[i][0] for i in range 2N)。现在考虑第i个人,如果把他分到B成,则总成本的变化为cost[i][1]-cost[i][0]。如果他离B城更近(或者说成本更低),则cost[i][1]-cost[i][0]<0,总成本会下降。每次挑出能够让总成本下降最多的那个人,把他分配到B城,直到A、B两地人数相等即可。
2.2 代码
class Solution {
public:
int twoCitySchedCost(vector<vector<int>>& costs) {
int result = 0;
vector<int> diff(costs.size(),0);
for(int i = 0; i < costs.size(); i++)
{
result += costs[i][0];
diff[i] = costs[i][1]-costs[i][0];
}
sort(diff.begin(),diff.end());
for(int i = 0; 2*i < costs.size(); i++)
result += diff[i];
return result;
}
};
3 标准解
int twoCitySchedCost(vector<vector<int>>& cs, int res = 0) {
nth_element(begin(cs), begin(cs) + cs.size() / 2, end(cs), [](vector<int> &a, vector<int> &b) {
return (a[0] - a[1] < b[0] - b[1]);
});
for (auto i = 0; i < cs.size() / 2; ++i) {
res += cs[i][0] + cs[i + cs.size() / 2][1];
}
return res;
}