【华为OD机考 统一考试机试】剩余银饰的重量
题目描述
有 N
块二手市场收集的银饰,每块银饰的重量都是正整数,收集到的银饰会被熔化用于打造新的饰品。 每一回合,从中选出三块 最重的 银饰,然后一起熔掉。假设银饰的重量分别为 x
、y
和 z
,且 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
。
输入描述
输入数据为两行
第一行为银饰数组长度 n
,1 ≤ 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四种语言的解法。