栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【华为机试】【校招】【7.14】【Java】分糖

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【华为机试】【校招】【7.14】【Java】分糖

第二题,应该是哪里要贪心或者分治?要NlogN或者NsqrtN的。X个1-5的整数,要按顺序分N组,初始代价是2,如果相邻的分组和相同,代价不变,和不同,代价要加1。X,N <= 10^4
例:
3
3
1 1 1
输出 6 ,各一组,和都相等,代价都是2
3
2
2 3 5
输出 4,(2,3)(5)和相等,代价都是2
4
3
1 2 3 4
输出7,(1,2)(3)(4)代价2+2+3

public class MinCost {

    
    private static List> fairDivision(int[] input, int k) {
        List> resultList = new ArrayList<>(k);
        if (k > input.length || k < 0) {
            return resultList;
        } else if (k == input.length) {
            for (int c : input) {
                List t = new ArrayList<>();
                t.add(c);
                resultList.add(t);
            }
            return resultList;
        }

        for (int i = 0; i < k; i++) {
            resultList.add(new ArrayList<>());
        }

        int[] sortedInput = input.clone();
        int inputLen = sortedInput.length;
        // 正序排列
        Arrays.sort(sortedInput);

        // 从最大的开始填充到结果中
        for (int i = 0; i < k; i++) {
            resultList.get(i).add(sortedInput[inputLen - 1 - i]);
        }
        // 从大到小遍历剩下的数字
        for (int i = inputLen - 1 - k; i >= 0; i--) {
            ArrayList tempSum = new ArrayList<>(k);
            for (List l : resultList) {
                tempSum.add(getSum(l) + sortedInput[i]);
            }
            int minIndex = findMinIndex(tempSum); // 找出结果最小的那个分组
            resultList.get(minIndex).add(sortedInput[i]); // 将当前数加入那个分组
        }

        return resultList;
    }

    
    private static int findMinIndex(ArrayList list) {
        int res = 0;
        int t = Integer.MAX_VALUE;
        for (int index = 0; index < list.size(); index++) {
            if (list.get(index) < t) {
                t = list.get(index);
                res = index;
            }
        }
        return res;
    }

    private static void testAndPrint(int[] input, int k) {
        StringBuilder listArr = new StringBuilder();
        List> result = fairDivision(input, k);
        int preSum = 0;
        int cost = 2;
        for (int i=0;i
            List tmp = result.get(i);
            listArr.append("(");
            int tmpSum=0;
            for (int j=0;j
                int ele = tmp.get(j);
                tmpSum+=ele;
                listArr.append(ele);
                if (j!=tmp.size()-1){
                    listArr.append(",");
                }
            }

            if (i!=0){
                if (preSum==tmpSum){
                    cost+=2;
                }else {
                    cost+=3;
                }
            }
            preSum = tmpSum;
            listArr.append(")");
            if (i!=result.size()-1){
                listArr.append(",");
            }
        }
        StringBuilder ans = new StringBuilder();
        ans.append(cost).append(",").append(listArr);
        System.out.println(new String(ans));
    }


    
    private static int getSum(List list) {
        int res = 0;
        for (int i : list) {
            res += i;
        }
        return res;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int group = sc.nextInt();
        int[] arr = new int[n];
        for (int i=0;i
            arr[i] = sc.nextInt();
        }
        System.out.println(JSONObject.toJSONString(arr));
        testAndPrint(arr, group);

    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031860.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号