2025 A卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《分苹果》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C++
C
GO
题目名称:分苹果
- 知识点:位运算(异或)、贪心算法
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
A和B两个人分苹果。A希望按照他的计算规则平分苹果,他的计算规则是二进制加法不进位(即异或操作),例如:12 + 5 = 9(1100 ⊕ 0101 = 1001)。B的计算规则是十进制加法(正常进位)。B希望在满足A的要求下,获得尽可能多的苹果总重量。若无法满足A的要求,则输出-1。
输入描述:
- 第一行为苹果数量n(1 ≤ n ≤ 20000)。
- 第二行为每个苹果的重量w₁, w₂, …, wₙ(1 ≤ wᵢ ≤ 10000)。
输出描述:
- 满足A要求时,B能获得的最大苹果总重量;否则输出-1。
示例:
输入:
3
3 5 6
输出:
11
说明:3 ⊕ 5 ⊕ 6 = 0,满足A的要求,B拿走5和6,总重量为11。
Java
问题分析
题目要求A和B分苹果,A的规则是异或操作平分,B希望获得最大总重量。核心问题在于:
- 异或总和是否为0:若不为0,无法平分,直接返回-1。
- 最大总重量计算:当异或总和为0时,B应拿走除最小苹果外的所有苹果,确保总重量最大。
解题思路
- 异或总和检查:遍历所有苹果计算异或总和。若非0,直接返回-1。
- 贪心选择:若异或总和为0,总重量减去最小苹果重量即为B能获得的最大值。
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 读取苹果数量
int[] apples = new int[n]; // 存储每个苹果的重量
// 读取苹果重量并计算异或总和、总重量、最小重量
int xorSum = 0;
int totalSum = 0;
int minApple = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
apples[i] = scanner.nextInt();
xorSum ^= apples[i]; // 异或总和
totalSum += apples[i]; // 总重量
if (apples[i] < minApple) {
minApple = apples[i]; // 更新最小重量
}
}
// 异或总和非0,无法满足A的规则,输出-1
if (xorSum != 0) {
System.out.println(-1);
} else {
// 输出总重量减去最小苹果的重量
System.out.println(totalSum - minApple);
}
}
}
代码解析
输入处理:
Scanner
读取输入数据。n
存储苹果数量,apples
数组存储每个苹果重量。
计算关键值:
xorSum
:所有苹果异或的总和,用于判断是否能平分。totalSum
:所有苹果的总重量。minApple
:所有苹果中的最小重量,用于贪心策略。
判断条件:
- 若
xorSum != 0
,输出-1(无法满足A
- 若