华为OD机试真题【篮球比赛】

news/2024/5/19 11:04:38 标签: java, OD, 回溯算法, 组合

1、题目描述

【篮球比赛】
一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。
打分规则为每个评委对选手打分,最高分10分,最低分1分。
请计算得分最多的3位选手的编号。
如果得分相同,则得分高分值最多的选手排名靠前
(10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。
【输入描述】
10个篮球队员的战斗力(整数,范围[1, 10000]),战斗力之间用空格分隔,如:10987654321
不需要考虑异常输入的场景。
【输出描述】
最小的战斗力差值,如:1
【示例1】
【输入】

10 9 8 7 6 5 4 3 2 1
【输出】
说明: .
1 2 5 9 10分为一队,3 4 6 7 8分为一队,两队战斗之差最小,输出差值1。
备注:球员分队方案不唯一 ,但最小战斗力差值固定是1。

2、解题思路

该题类似于将10个数分成两组,使得两组的数和之差最小。最小战斗力从差值0开始,不满足依次增加,差值为0,即将10个战斗力之和平分给两组,若无法平分则不满足,差值增加。若满足则利用回溯算法统计满足选出5个数且之后恰好为平均值的数。

3、参考代码

java">import java.util.Arrays;
import java.util.Scanner;

/**
 * @Author 
 * @Date 2023/6/11 15:15
 */
public class 篮球比赛 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int[] array = Arrays.stream(in.nextLine().split(" "))
                    .mapToInt(Integer::parseInt).toArray();

            int totalSum = 0;
            for (int arr : array) {
                totalSum += arr;
            }

            // 从0开始找最小差值战斗力
            for (int i = 0; i <= totalSum; i++) {
                int target = (totalSum - i);
                if (target % 2 == 0) {  // 总和减去差值可以被平分为两组
                    if (dfs(array, 0, target / 2, new boolean[10])) {
                        System.out.println(i);  // 能匹配则输出
                        break;
                    }
                }
            }

        }
    }

    // 回溯 遍历搜索分配球员
    public static boolean dfs(int[] array, int startIndex, int sum, boolean[] used) {
        if (startIndex > 5 || sum < 0) {
            return false;
        }
        if (startIndex == 5 && sum == 0) {
            return true;
        }

        for (int i = 0; i < array.length; i++) {
            if (used[i]) {
                continue;
            }
            used[i] = true;
            if (dfs(array, startIndex + 1, sum - array[i], used)) {
                return true;
            }
            used[i] = false;  // 回溯 不选
        }
        return false;
    }
}

4、相似题目

(1)代码随想录回溯算法组合题型


http://www.niftyadmin.cn/n/5019616.html

相关文章

Mybatis -- 读取 DATE 类型字段时可能遇到的问题(夏令时问题)

在使用 MYBATIS 读取数据库字段的时候&#xff0c;我们一般需要为查询字段指定数据类型。特别是当我们使用 mybatis generator 去生成对应的接口代码时&#xff0c;会自动按照数据库字段类型生成响应映射规则的代码。   如下&#xff0c;左侧是 date 类型生成的字段映射规则&…

全开源影视APP源码带后台 苍穹影视APP源码 免受权带安装教程

苍穹影视 V20 全新后台七彩视界免受权开源源码此版本为天穹公益版开源无解密安装教程 全新后台很是都雅,源码全开源无加密。 PC 端对接教程&#xff1a; 建议在浮图下操作 正常安装前后端 然后安装米酷 cms 根据教程安装即可 米酷 cms 对接部门已被我改动&#xff0c;只要在安装…

SQL1 查询所有列

描述 题目&#xff1a;现在运营想要查看用户信息表中所有的数据&#xff0c;请你取出相应结果 示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing42315female23浙江大学…

「Java开发指南」在MyEclipse中的Spring开发(一)

MyEclipse v2023.1.2离线版下载(Q技术交流&#xff1a;742336981&#xff09; 1. 什么是Spring&#xff1f; 在MyEclipse中引入Spring比大多数框架更难&#xff0c;因为它不是一种单一用途的技术。Spring被认为是Java软件开发在几乎每个领域都有最佳实践的巨大框架&#xff0…

App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge&#xff08;Android 调试桥&#xff09;&#xff0c;是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#xff0c;可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

MySQL——面试必背题

1、什么是数据库索引&#xff1f; 索引是一种特殊的数据结构&#xff0c;用于快速查找特定值。它可以让数据库在进行数据检索时更加高效。MySQL索引是基于B-Tree算法的&#xff0c;可以在O&#xff08;logN&#xff09;时间内找到数据。 索引的好处是可以提高查询的效率&#x…

修改Docker镜像默认下载地址

1、安装完docker desktop后&#xff0c;先不要打开 2、新建目录 D:\ProgramData\Docker 3、在C:\Users\你的用户名\AppData\Local下&#xff0c;打开cmd或者powershell执行以下命令&#xff0c;命令语法略有不同。 powershell命令&#xff1a; cmd /c mklink /J Docker D:\Pro…

查看Android App包名,查看keystore的信息,导出公钥

查看Android App包名的三种方法 cmd中输入命令&#xff1a;adb shell am monitor 然后启动需要获取包名的应用cmd中输入命令&#xff1a;adb shell pm list packages -3 查看自己安装的app包名安卓系统中&#xff1a;设置——应用——正在运行 查看…