• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Niro Einteson
文可提笔安天下 武可上马定乾坤
博客园    首页    新随笔    联系   管理    订阅  订阅

1029. 两地调度

1029. 两地调度

 

公司计划面试 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,每个城市都有一半的人在面试。
 

提示:

1 <= costs.length <= 100
costs.length 为偶数
1 <= costs[i][0], costs[i][1] <= 1000

 

 1 扩展:如果有去多个城市的,那么如何解决,dp;
 2 
 3 思路:将这 2N 个人全都安排飞往 B 市,再选出 N 个人改变它们的行程,
 4 让他们飞往 A 市。如果选择改变一个人的行程,那么公司将会额外付出 price_A - price_B 的费用,
 5 这个费用可正可负。
 6 最优的方案是,选出 price_A - price_B 最小的 个人,让他们飞往 A 市,其余人飞往 B 市。
 7 
 8 排序方式
 9 sort(costs.begin(),costs.end(),[](vector<int> &a, vector<int> &b) {return a[0]-a[1] < b[0]-b[1];});
10 sort(costs.begin(), costs.end(),[&](const vector<int> a1, const vector<int> b1){  return ((a1[1] - a1[0]) < (b1[1] - b1[0])); });
11 
12 把二维vector按costs[i][0]-costs[i][1]递增排序 一个人去A城市的价格减去他去B城市的价格越小,最好为负值,说明他去A城市越划算。

 

 1 class Solution {
 2 public:
 3     static bool cmp(vector<int>&x,vector<int>& y){
 4         return x[0]-x[1]<y[0]-y[1];
 5     }
 6     int twoCitySchedCost(vector<vector<int>>& costs) {
 7         /*思路:
 8             将数组按照去第一个城市-去第二个城市的 价格从小到大排序,
 9             [[184,139],[259,770],[448,54],[577,469],[840,118],[926,667]]
10             1859           
11         */
12         sort(costs.begin(),costs.end(),cmp);
13         int sum=0;
14         for(int i=0;i<costs.size();i++){
15             if(i<costs.size()/2)   sum+=costs[i][0];//前一半去A
16             else sum+=costs[i][1];//后一半去B
17         }
18         return sum;
19     }
20 };

 

posted @ 2019-12-07 16:29  Nirogo  阅读(291)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3