华为OD机试 - 分苹果 - 二进制(Java 2023 B卷 100分)-LMLPHP

专栏导读

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

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

一、题目描述

A、B两个人把苹果分为两堆。

A希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算进位12+5=9(1100+0101=9);

B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多。

输入苹果的数量和每个苹果重量,输出满足A的情况下B获取的苹果总重量。

如果无法满足A的要求,输出-1。

数据范围

1<=总苹果数量<=20000

1<=每个苹果重量<=10000

二、输入描述

输入第一行是苹果数量:3

输入第二行是每个苹果重量:3 5 6

三、输出描述

输出第一行是B获取的苹果总重量:11

四、解题思路

这道题的主要问题是题意的理解。

A的算法规则:按照二进制加法计算,并且不计算进位

输出满足A的情况下B获取的苹果总重量。

满足A的情况,是什么情况?

再读一遍,按照二进制加法计算,并且不计算进位。

我的理解是相加等于0就算满足A规则。

例如3 5 6。

  • 3的二进制是11;
  • 5的二进制是101;
  • 6的二进制是110;

核心算法:按照二进制加法计算,并且不计算进位。

  • 3 + 5 = 11 + 101 = 110,十进制是6;
  • 第三个也是6,即平分;

也可以理解为:

3 + 5 + 6 = 11 + 101 + 110 = 000即0,满足A算法,即平分。

A算法的核心就是异或总结果为0时,满足A算法规则。

五、Java算法源码

package com.guor.od;

import java.util.*;

public class OdTest02 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 苹果数量
        int n = Integer.parseInt(sc.nextLine());
        // 每个苹果重量
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        int sum = 0;
        int min = Integer.MAX_VALUE;
        int tempSum = 0;

        for (int i = 0; i < n; i++) {
            // B计算的苹果总数
            sum += arr[i];

            // A算法的核心就是异或总结果为0
            tempSum ^= arr[i];
            if (min > arr[i]) {
                // 找到最小的值
                min = arr[i];
            }
        }

        // 苹果可以分
        if (tempSum == 0) {
            // 则B拿到苹果数为:总数-最小数
            int bSum = sum - min;
            System.out.println(bSum);
        } else {
            // 不可以分苹果时输出 -1
            System.out.println(-1);
        }
    }
}

六、效果展示

1、输入

3
3 5 6

2、输出

11

3、说明

  • 3的二进制是11;
  • 5的二进制是101;
  • 6的二进制是110;

核心算法:按照二进制加法计算,并且不计算进位。

3 + 5 = 11 + 101 = 110,十进制是6;
第三个也是6,即平分;

也可以理解为:

3 + 5 + 6 = 11 + 101 + 110 = 000即0,满足A算法,即平分。

按照A的算法,A获得6个苹果,剩下的都归B。

一共 3 + 5 +6 = 14个苹果,A拿了6个,B得到了8个苹果。

但是,B希望在满足A的情况下获取苹果重量最多。

还有其它情况吗?

5 + 6 = 101 + 110 = 11即3,满足A算法,即平分。

哈哈,A只获得了3个苹果,B获得了11个苹果。

这也提醒了大家,千万不要在代码中炫技。十进制平分你不干,非得来个二进制不进位分苹果,哎,A亏大了。

华为OD机试 - 分苹果 - 二进制(Java 2023 B卷 100分)-LMLPHP


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

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

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

华为OD机试 - 分苹果 - 二进制(Java 2023 B卷 100分)-LMLPHP

09-18 15:33