力扣每日一练 : 两地调度: 2n 个 集合中求出平均分配后的最小和 ;

示例 1:
输入:costs = [[10,20],[30,200],[400,50],[30,20]]
输出:110
解释:
第一个人去 a 市,费用为 10。
第二个人去 a 市,费用为 30。
第三个人去 b 市,费用为 50。
第四个人去 b 市,费用为 20。
最低总费用为 10 + 30 + 50 + 20 = 110,每个城市都有一半的人在面试。
    
示例 2:
输入:costs = [[259,770],[448,54],[926,667],[184,139],[840,118],[577,469]]
输出:1859
    
示例 3:
输入:costs = [[515,563],[451,713],[537,709],[343,819],[855,779],[457,60],[650,359],[631,42]]
输出:3086

public class test3 {
    public static void main(String[] args) {

        List<Integer> add = List.of(515,563);//A
        List<Integer> add1 = List.of(451,713);//B
        List<Integer> add2 = List.of(537,709);//B
        List<Integer> add3 = List.of(343,819);//B
        List<Integer> add4 = List.of(457,60);//B
        List<Integer> add5 = List.of(650,359);//B
        List<Integer> add6 = List.of(631,42);//B
        List<Integer> add7 = List.of(855, 779);
        List<List<Integer>> list4 = List.of(add, add1, add2, add3, add4, add5 , add6 ,add7);
        //costs = [[515,563],[451,713],[537,709],[343,819],[855,779],[457,60],[650,359],[631,42]]
        System.out.println(list4);

        //遍历得到所有数组中的差值
        Map<Integer, Integer> map1 = new HashMap<>();
        for (int i = 0; i < list4.size(); i++) {
            List<Integer> list = list4.get(i);
            int i1 = (list.get(1)) - (list.get(0));
            if (i1 > 0) {
                map1.put(i, i1);
            } else {
                map1.put(i, i1);
            }
        }
        System.out.println(map1);//{0=48, 1=262, 2=172, 3=476, 4=-397, 5=-291, 6=-589, 7=-76}

        //汇总集合的长度
        int size = list4.size();
        //最后得到的总和计数
        int result = 0;
        //初始化一个分配系数
        int a = 0;
        int b = 0;
        while (map1.size()>0) {
            //初始化最大差值key
            int key = 0;
            int value = 0;
            int i = 0;
            for (Integer integer : map1.keySet()) {
                //初始化最大差值为起始点
                if (i == 0) {
                    //转正数
                    value = Math.abs(map1.get(integer));
                    key = integer;
                } else {
                    //转正数
                    if (Math.abs(map1.get(integer)) > value) {
                        //替换最大差值
                        key = integer;
                    }
                }
                i++;
            }
            //根据差值正负,算 分配 到哪边
            Integer integer = map1.get(key);
            if (integer > 0 ) {
                if (a < (size/2) ) {
                    result = result + list4.get(key).get(0);
                    a++;
                }else {
                    result = result + list4.get(key).get(1);
                    b++;
                }
            } else {
                if ( b <(size/2) ){
                    result = result + list4.get(key).get(1);
                    b++;
                }else {
                    result = result + list4.get(key).get(0);
                    a++;
                }
            }
            //移除算过的key值
            map1.remove(key);
            System.out.println("此时map1的值为: " + map1);
        }
        System.out.println(a+"   "+b);
        System.out.println("结果是:" + result);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值