2025 A卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《游戏分组王者荣耀》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C
GO
题目名称:游戏分组王者荣耀
知识点: 递归与回溯、组合枚举
时间限制: 1秒
空间限制: 256MB
限定语言: 不限
题目描述
部门准备举办一场王者荣耀表演赛,有10名游戏爱好者参与,分为两队,每队5人。每位参与者都有一个评分,代表其游戏水平。为了表演赛尽可能精彩,需将10名参赛者分为实力尽量相近的两队。一队的实力为该队5名队员的评分总和。
现给定10名参与者的游戏水平评分,要求找出两组实力差绝对值的最小值。
输入描述
- 输入为10个整数,表示10名参与者的评分,范围在[1,10000]之间。
- 输入格式为单行,元素通过空格分隔,例如:
5 1 8 3 4 6 7 10 9 2
。
输出描述
- 输出1个整数,表示分组后两组实力差绝对值的最小值。
用例
-
输入:
1 2 3 4 5 6 7 8 9 10
输出:
1
说明:分组为(1 3 5 7 9)和(2 4 6 8 10),两组实力差为1。
-
输入:
5 1 8 3 4 6 7 10 9 2
输出:
1
说明:分组为(1 3 5 8 10)和(2 4 6 7 9),实力差最小为1。
Java
问题分析
我们需要将10名游戏爱好者分为两队,每队5人,使得两队的实力差绝对值最小。每队的实力由队员的评分总和决定。输入为10个整数,输出最小的实力差绝对值。
解题思路
- 组合枚举:总共有C(10,5)=252种组合,枚举所有可能的5人组合,计算每种组合的总和。
- 差值计算:对于每个组合的总和sum_group,另一队的总和为sum_total - sum_group,差值绝对值为|sum_total - 2 * sum_group|。
- 最小差值追踪:遍历所有组合,记录最小的差值。
代码实现
import java.util.Scanner;public class Main {private static int[] scores = new int[10]; // 存储输入的10个评分private static int sumTotal; // 所有评分的总和private static int minDiff = Integer.MAX_VALUE; // 记录最小差值,初始设为最大整数public static void main(String[] args) {// 读取输入Scanner scanner = new Scanner(System.in);for (int i = 0; i < 10; i++) {scores[i] = scanner.nextInt();}scanner.close();// 计算总评分sumTotal = 0;for (int score : scores) {sumTotal += score;}// 使用回溯算法遍历所有可能的5人组合backtrack(0, 0, 0);// 输出最小差值System.out.println(minDiff);}/*** 回溯算法生成所有5人组合,并计算最小差值* @param start 当前选择的起始索引,避免重复组合* @param count 已选人数* @param currentSum 当前已选人员的评分总和*/private static void backtrack(int start, int count, int currentSum) {// 当已选人数达到5人时,计算差值if (count == 5) {int diff = Math.abs(sumTotal - 2 * currentSum);if (diff < minDiff) {minDiff = diff;}return;}// 遍历可能的选项,从start开始避免重复for (int i = start; i < 10; i++) {// 递归选择下一个元素backtrack(i + 1, count + 1, currentSum + scores[i]);}}
}
代码详细解析
- 输入处理:使用
Scanner
读取输入的10个整数,存入数组scores
。 - 总和计算:遍历数组计算总评分
sumTotal
。 - 回溯函数<