LeetCode1029两地调度

题目描述:公司计划面试 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;
    }
}

发布了37 篇原创文章 · 获赞 19 · 访问量 838

猜你喜欢

转载自blog.csdn.net/qq_44867340/article/details/104196938
今日推荐