题目:
公司计划面试 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,每个城市都有一半的人在面试。
解题方法:
再次做一个搬运工,贪心的策略玩不清楚,好在有大佬分享了数学方法,感觉用优化的思想来处理问题,逻辑上更加清晰。
上面公式中xi就是选去A城还是不去,化简以后的式子其实就很清楚了,左边是一个常数项,右边是需要最小化的部分,也就是很多解题方法中提到的A城代价减去B城代价,为什么要排序呢,因为选择N个最小的代价查就可以最小化目标函数。
代码和结果:
class Solution {
public:
int twoCitySchedCost(vector<vector<int>>& costs) {
vector<int> diff(costs.size());
int smv=0;
for(int i=0;i<costs.size();i++)
{
diff[i]=costs[i][0]-costs[i][1];
smv+=costs[i][1];
}
sort(diff.begin(),diff.end());
for(int i=0;i<costs.size()/2;i++)
{
smv+=diff[i];
}
return smv;
}
};
运行结果:
网友评论