华为OD机试 - 剩余银饰的重量(Java 2024 C卷 100分)

刺骨的言语ヽ痛彻心扉 2024-05-28 10:25 90阅读 0赞

在这里插入图片描述

华为OD机试 2024C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷+C卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

有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

四、解题思路

该问题要求处理一组银饰的重量,通过特定的熔化规则不断减少银饰数量,直到剩余少于三块银饰。具体熔化规则根据最重的三块银饰的重量差异来决定是否生成新的剩余银块。解决这个问题的一个简单方法是使用排序和模拟的方式。

这个问题的核心思路是:

  1. 对所有银饰重量进行排序。
  2. 每次选择最重的三块银饰,按规则进行熔化。
  3. 更新剩余银饰的数组,如果有新的剩余银块产生,将其加入数组。
  4. 重复上述过程,直到剩余银饰不足三块。
  5. 根据最后剩余的银饰数量,返回对应的结果。

五、Java算法源码

  1. public class OdTest01 {
  2. public static void main(String[] args) {
  3. Scanner scanner = new Scanner(System.in);
  4. int n = scanner.nextInt();
  5. List<Integer> weights = new ArrayList<>();
  6. for (int i = 0; i < n; i++) {
  7. weights.add(scanner.nextInt());
  8. }
  9. System.out.println(meltSilverware(weights));
  10. }
  11. private static int meltSilverware(List<Integer> weights) {
  12. // 当银饰数少于3块时,处理剩余情况
  13. while (weights.size() >= 3) {
  14. Collections.sort(weights, Collections.reverseOrder()); // 降序排序
  15. int z = weights.get(0);
  16. int y = weights.get(1);
  17. int x = weights.get(2);
  18. // 移除最重的三块银饰
  19. weights.remove(0);
  20. weights.remove(0);
  21. weights.remove(0);
  22. // 根据规则计算剩余银饰
  23. if (x == y && y == z) {
  24. // 全部熔掉,不剩余
  25. } else if (x == y && y != z) {
  26. // 剩余 z - y
  27. weights.add(z - y);
  28. } else if (x != y && y == z) {
  29. // 剩余 y - x
  30. weights.add(y - x);
  31. } else if (x != y && y != z) {
  32. // 剩余 z - y 与 y - x
  33. int newWeight = Math.abs((z - y) - (y - x));
  34. if (newWeight > 0) {
  35. weights.add(newWeight);
  36. }
  37. }
  38. }
  39. // 处理剩余的银饰情况
  40. if (weights.size() == 2) {
  41. return Math.max(weights.get(0), weights.get(1));
  42. } else if (weights.size() == 1) {
  43. return weights.get(0);
  44. } else {
  45. return 0;
  46. }
  47. }
  48. }

六、效果展示

1、输入

3
3 7 10

2、输出

1

3、说明

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

在这里插入图片描述

?下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)

?本文收录于,华为OD机试(JAVA)真题(A卷+B卷+C卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,90人围观)

还没有评论,来说两句吧...

相关阅读