目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
- 核心算法:按照二进制加法计算,并且不计算进位。
- 但是,B希望在满足A的情况下获取苹果重量最多。
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为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机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。