【华为OD机考 统一考试机试】剩余银饰的重量

题目描述

N 块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。 每一回合,从中选出三块 最重的 银饰,然后一起熔掉。假设银饰的重量分别为 xyz,且 x <= y <= 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

输入描述

输入数据为两行

第一行为银饰数组长度 n1 ≤ n ≤ 40

第二行为 n 块银饰的重量,重量的取值范围为[1,2000],重量之间使用空格隔开

输出描述

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

示例一

输入

3
1 1 1

输出

0

说明

选出 1 1 1,得到 0,最终数组转换为 [],最后没有剩下银块,返回 0

示例二

输入

3
3 7 10

输出

1

说明

选出 3 7 10,需要计算 (7-3)(10-7) 的差值,即(7-3)-(10-7)=1,所以数组转换为 [1],剩余一块,返回该块重量,返回 1

Java

import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取银饰的数量
        int n = scanner.nextInt();
        // 创建优先队列,使用反向顺序以便队列头是最大元素
        PriorityQueue<Integer> silverPieces = new PriorityQueue<>(Collections.reverseOrder());

        // 循环读取每块银饰的重量并

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

华为OD机试刷题 文章被收录于专栏

华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务