美文网首页
两地调度

两地调度

作者: WAI_f | 来源:发表于2020-06-29 23:38 被阅读0次

题目:

公司计划面试 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;
    }
};
运行结果:

原题链接:https://leetcode-cn.com/problems/two-city-scheduling/

相关文章

网友评论

      本文标题:两地调度

      本文链接:https://www.haomeiwen.com/subject/sypzfktx.html