剩余银饰的重量

题目描述

有 N 块 二手市场9 收集的银饰,每块银饰的重量都是正整数,!
收集到的银饰会被熔化用于打造新的饰品。
每一回合,从中选出三块最重的银饰,然后一起熔掉。
假设银饰的重量分别为 x、y和z,且xsy≤z。那么熔掉的可能结果如下:
如果x==y== Z,那么三块银饰都会被完全熔掉;
如果x==y且y!=z,会剩余重量为z-y的银块无法被熔掉;
如果 x!=y且y==Z,会剩余重量为 y-x的银块无法被熔掉,
如果 x!=y且y!=z,会剩余重量为 z-y与y-x差值 的银块无法被熔掉。
最后
如果剩余两块,返回较大的重量(若两块重量相同,返回任意一块皆可)
如果只剩下一块,返回该块的重量
如果没有剩下,就返回 0

输入描述

输入数据为两行:
第一行为银饰数组长度 n,1sn≤40,
第二行为n块银饰的重量,重量的取值范围为[1,2000],重量之间使用空格隔开

输出描述

如果剩余两块,返回较大的重量(若两块重量相同,返回任意一块皆可)
如果只剩下一块,返回该块的重量;
如果没有剩下,就返回 0.

用例

剩余银饰的重量_第1张图片

public class 剩余银饰的重量 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        PriorityQueue q = new PriorityQueue<>(Comparator.reverseOrder());
        for (int i = 0; i < n; i++) {
            int i1 = sc.nextInt();
            q.add(i1);
        }
        while (q.size() >= 3){
            int z = q.poll();
            int y = q.poll();
            int x = q.poll();
            int res  = getdeal(x, y, z);
            if (res != 0){
                q.add(res);
            }
        }
        int ans = q.size() != 0 ? q.peek() : 0;
        System.out.println(ans);
    }

    private static int getdeal(int x, int y, int z) {
        int res = 0;
        if (x == y && y == z){
            res = 0;
        }else if (x == y && y != z){
            res = z - y;
        }else if (x != y && y == z){
            res = y -x;
        }else {
            res = Math.abs(z - y - y + x);
        }
        return res;
    }
}

你可能感兴趣的:(2024年9月华为OD刷题集,算法,java,华为od,面试)