华为OD机试真题——游戏分组王者荣耀(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

在这里插入图片描述

2025 B卷 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. 输入

    1 2 3 4 5 6 7 8 9 10  
    

    输出

    1  
    

    说明:分组为(1 3 5 7 9)和(2 4 6 8 10),两组实力差为1。

  2. 输入

    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个整数,输出最小的实力差绝对值。

解题思路

  1. 组合枚举:总共有C(10,5)=252种组合,枚举所有可能的5人组合,计算每种组合的总和。
  2. 差值计算:对于每个组合的总和sum_group,另一队的总和为sum_total - sum_group,差值绝对值为|sum_total - 2 * sum_group|。
  3. 最小差值追踪:遍历所有组合,记录最小的差值。

代码实现

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]);
        }
    }
}

代码解析

  1. 输入处理:使用Scanner读取输入的10个整数,存入数组scores
  2. 总和计算:遍历数组计算总评分sumTotal。</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纪元A梦

再小的支持也是一种动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值