题目描述:公司计划面试 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
分析:此题就是求最小消耗问题,但自己也用了不少时间,还是过于菜啊哈哈
因为要求每个目的地的人数都为总人数的一半人,所以不能只要每个人单一到单个目的地的最短距离,
自己第一次就是这么做的就被干了
方法一:自己总结出来的,先让每个人都到消耗最短的目的地上去,然后再在目的地多的人数进行调度多余的人,而调度的人则要选择差值最小的,因为是去a低消耗pa,去b消耗pb,所以要换地就要多消耗pa-pb
方法二:当然是看的题解,当然也是绝壁强。首先假设让2N都去b地,不论是最长还是最短的,然后就要挑选出N个不去b地的,那么这N个怎么选出来呢?也是用pa-pb,如果是正的代表去a 地比去b地代价高,如果是负的代表去a地比去b地代价小,当然是越小越好了,最后再求和就可以了
代码如下:
class Solution {
public int twoCitySchedCost(int[][] costs) {
int sum=0;
int cha[]=new int[costs.length];
for(int i=0;i<costs.length;i++) {
sum+=costs[i][1];
cha[i]=costs[i][0]-costs[i][1];
}
Arrays.sort(cha);
for(int i=0;i<costs.length/2;i++) {
sum+=cha[i];
}
return sum;
}
}