【华为OD-E卷 - 篮球比赛 100分(python、java、c++、js、c)】

【华为OD-E卷 - 篮球比赛 100分(python、java、c++、js、c)】

题目

篮球(5V5)比赛中,每个球员拥有一个战斗力,每个队伍的所有球员战斗力之和为该队伍的总体战斗力。
现有10个球员准备分为两队进行训练赛,教练希望2个队伍的战斗力差值能够尽可能的小,以达到最佳训练效果。
给出10个球员的战斗力,如果你是教练,你该如何分队,才能达到最佳训练效果?请说出该分队方案下的最小战斗力差值

输入描述

  • 0个篮球队员的战斗力(整数,范围[1,10000]),战斗力之间用空格分隔,如:10987654321

不需要考虑异常输入的场景

输出描述

  • 最小的战斗力差值,如:1

用例

用例一:
输入:
10 9 8 7 6 5 4 3 2 1
输出:
1

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

python解法

  • 解题思路:
  • 问题描述:给定一组球员的能力值,将球员分成两队,每队5人,要求两队的能力值之差的绝对值最小。返回最小的能力值差。

思路分析:

组合生成:用 itertools.combinations 生成所有可能的5人队伍。
能力值计算:计算当前组合的总能力值,另一队的能力值等于总能力减去当前组合的能力值。
差值比较:计算两队能力值的差的绝对值,并更新最小差值。
优化:由于组合生成的时间复杂度较高,适合用于小规模输入,10个球员的场景是可接受的

from itertools import combinations

def get_min_diff_power(players):
    # 总能力值,所有球员的能力值求和
    total_power = sum(players)
    # 初始化最小差值为正无穷
    min_diff = float('inf')

    # 遍历所有可能的5人组合
    for team in combinations(players, 5):
        # 当前组合的能力值
        team_power = sum(team)
        # 另一队的能力值
        other_team_power = total_power - team_power
        # 更新最小差值
        min_diff = min(min_diff, abs(team_power - other_team_power))

    # 返回最小的能力值差
    return min_diff

# 输入球员的能力值,使用空格分隔,转换为整数列表
players = list(map(int, input().split()))
# 输出最小能力值差
print(get_min_diff_power(players))

java解法

  • 解题思路

排序:对输入数组进行排序,方便处理和优化递归。
组合生成:通过递归生成所有可能的5人队伍,并计算其能力值的总和。
差值计算:利用队伍的能力值总和计算两队差值的绝对值。
最小值判断:通过 stream 找到最小差值并返回。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] nums = new int[10]; // 输入的10个球员的能力值
        for (int i = 0; i < 10; i++) {
            nums[i] = sc.nextInt(); // 依次读取能力值
        }
        // 输出最小的能力值差
        System.out.println(findMinDiff(nums));
    }

    // 寻找最小能力值差
    public static int findMinDiff(int[] nums) {
        Arrays.sort(nums); // 将数组排序,便于递归处理(可优化剪枝)
        ArrayList<Integer> teamSums = new ArrayList<>(); // 存储所有5人队伍的能力值总和
        calculateCombinations(nums, 0, 0, 0, teamSums); // 递归生成组合并计算能力值总和

        int totalSum = Arrays.stream(nums).sum(); // 计算所有球员的总能力值
        // 遍历所有组合能力值,计算两队能力值差,并返回最小值
        return teamSums.stream()
                .map(subSum -> Math.abs(totalSum - 2 * subSum)) // totalSum - 2 * subSum 是差值公式
                .min(Integer::compare) // 找到最小值
                .orElse(0); // 若列表为空,返回0
    }

    // 递归生成所有可能的5人队伍,并计算能力值总和
    public static void calculateCombinations(int[] nums, int start, int depth, int sum, ArrayList<Integer> results) {
        if (depth == 5) { // 当选择了5人时,记录当前组合的能力值总和
            results.add(sum);
            return;
        }

        // 遍历当前起点之后的所有球员
        for (int i = start; i < 10; i++) {
            // 避免重复组合,例如相邻两个球员能力值相同时跳过
            if (i > start && nums[i] == nums[i - 1]) continue;
            // 递归选择下一个球员
            calculateCombinations(nums, i + 1, depth + 1, sum + nums[i], results);
        }
    }
}

C++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

  • 题目背景: 给定一个整数数组,要求将数组分为两个子集,使两个子集的元素和的差最小。

解题分析:

假设数组总和为 totalPower,子集1的和为 partialSum,子集2的和为 totalPower - partialSum。
差值为 Math.abs(totalPower - 2 * partialSum)。
目标是找到一个 partialSum,使得上述差值最小。
解决方法:

遍历所有可能的子集,计算每个子集的和。
用递归的方法生成所有可能的子集和。
对于每种可能的子集和,计算差值并找到最小值。
优化:

使用一个数组保存所有的子集和,避免重复计算。
由于组合的数量较大,可以通过限制子集的大小(如限制子集大小为5)来减少计算量。

const readline = require("readline"); // 引入 readline 模块,用于处理标准输入输出

// 创建一个 readline 接口,用于从命令行读取输入
const rl = readline.createInterface({
  input: process.stdin, // 标准输入
  output: process.stdout, // 标准输出
});

// 监听每一行输入
rl.on("line", (line) => {
  const arr = line.split(" ").map(Number); // 将输入的字符串分割成数组,并转换为数字
  console.log(findMinDifference(arr)); // 调用函数计算最小差值,并打印结果
});

/**
 * 主函数:找到两个子集和的最小差值
 * @param {number[]} arr 输入的整数数组
 * @returns {number} 最小差值
 */
function findMinDifference(arr) {
  arr.sort((a, b) => a - b); // 对数组进行排序,便于后续处理

  const allCombinations = []; // 存储所有子集和
  findCombinations(arr, 0, 0, 0, allCombinations); // 调用递归函数生成所有可能的子集和

  const totalPower = arr.reduce((acc, val) => acc + val, 0); // 计算数组的总和

  // 遍历所有子集和,计算差值并返回最小差值
  return allCombinations
    .map((partialSum) => Math.abs(totalPower - 2 * partialSum)) // 计算每种子集和的差值
    .sort((a, b) => a - b)[0]; // 返回最小差值
}

/**
 * 递归函数:生成所有可能的子集和
 * @param {number[]} arr 输入数组
 * @param {number} start 当前起始索引
 * @param {number} depth 当前子集的深度
 * @param {number} partialSum 当前子集的和
 * @param {number[]} result 保存所有子集和的数组
 */
function findCombinations(arr, start, depth, partialSum, result) {
  if (depth === 5) { // 如果当前子集的大小达到5
    result.push(partialSum); // 将当前子集的和加入结果数组
    return; // 结束当前递归
  }

  // 遍历数组中的每个元素,从 start 开始
  for (let i = start; i < arr.length; i++) {
    findCombinations(arr, i + 1, depth + 1, partialSum + arr[i], result); 
    // 递归:选择当前元素,更新索引、深度和子集和
  }
}

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】C++11(二)

目录 九、可变参数模板十、lambda表达式10.1 C98中的一个例子10.2 lambda表达式10.3 lambda表达式语法10.3.1 lambda表达式各部分说明10.3.2 捕获列表说明 10.4 函数对象与lambda表达式 十一、包装器11.1 function包装器11.2 bind 十二、线程库12.1 线程12.1.1 thread类的简单介…

《零基础Go语言算法实战》【题目 1-16】字符串的遍历与比较

《零基础Go语言算法实战》 【题目 1-16】字符串的遍历与比较 给出两个字符串&#xff0c;请编写程序以确定能否将其中一个字符串重新排列后变成另一个字符串&#xff0c; 并规定大小写是不同的字符&#xff0c;空格也作为字符考虑。保证两个字符串的长度小于或等于 5000。 …

Type-C单口便携显示器-LDR6021

Type-C单口便携显示器是一种新兴的显示设备&#xff0c;它凭借其便携性、高性能和广泛的应用场景等优势&#xff0c;正在成为市场的新宠。以下是Type-C单口便携显示器的具体运用方式&#xff1a; 一、连接与传输 1. **设备连接**&#xff1a;Type-C单口便携显示器通过Type-C接…

聚类系列 (二)——HDBSCAN算法详解

在进行组会汇报的时候&#xff0c;为了引出本研究动机&#xff08;论文尚未发表&#xff0c;暂不介绍&#xff09;&#xff0c;需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候&#xff0c;发现网络上对于DBSCAN算法的介绍非常多与细致&#xff0c;但…

玩转 JMeter:Random Order Controller让测试“乱”出花样

嘿&#xff0c;各位性能测试的小伙伴们&#xff01;今天咱要来唠唠 JMeter 里超级有趣又超实用的 Random Order Controller&#xff08;随机顺序控制器&#xff09;&#xff0c;它就像是性能测试这场大戏里的“魔术棒”&#xff0c;轻轻一挥&#xff0c;就能让测试场景变得千变…

L1G5000 XTuner 微调个人小助手认知

使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知 1 环境配置与数据准备步骤 0. 使用 conda 先构建一个 Python-3.10 的虚拟环境步骤 1. 安装 XTuner 修改提供的数据步骤 0. 创建一个新的文件夹用于存储微调数据步骤 1. 创建修改脚本步骤 2. 执行脚本步骤 3. 查看数据…

UE5 使用内置组件进行网格切割

UE引擎非常强大&#xff0c;直接内置了网格切割功能并封装为蓝图节点&#xff0c;这项功能在UE4中就存在&#xff0c;并且无需使用Chaos等模块。那么就来学习下如何使用内置组件实现网格切割。 1.配置测试用StaticMesh 对于被切割的模型&#xff0c;需要配置一些参数。以UE5…

springmvc执行分析

步骤分析 1.浏览器客户端携带请求路径&#xff0c;本案例中是“/hello”&#xff0c;通过 web.xml 中的前端控制器配置&#xff0c;发送请求到前端控制器(DispatcherServlet)&#xff0c;并加载 SpringMVC.xml 配置文件&#xff0c;将 HelloController 加载进IOC容器当中&…

LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145056912 Llama 3 是 Meta 公司发布的开源大型语言模型&#xff0c;包括具有 80 亿和 700 亿参数的预训练和指令微调的语言模型&#xff0c;支持…

【python基础——异常BUG】

什么是异常(BUG) 检测到错误,py编译器无法继续执行,反而出现错误提示 如果遇到错误能继续执行,那么就捕获(try) 1.得到异常:try的执行,try内只可以捕获一个异常 2.预案执行:except后面的语句 3.传入异常:except … as uestcprint(uestc) 4.没有异常:else… 5.鉴定完毕,收尾的语…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验六----流域综合处理(超超超详细!!!)

流域综合处理 流域综合治理是根据流域自然和社会经济状况及区域国民经济发展的要求,以流域水流失治理为中心,以提高生态经济效益和社会经济持续发展为目标,以基本农田优化结构和高效利用及植被建设为重点,建立具有水土保持兼高效生态经济功能的半山区流域综合治理模式。数字高程…

设计模式与游戏完美开发(3)

更多内容可以浏览本人博客&#xff1a;https://azureblog.cn/ &#x1f60a; 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第五章 获取游戏服务的唯一对象——单例模式&#xff08;Singleton&#xff09; 游戏实现中的唯一对象 在游戏开发过程中…

VSCode 在Windows下开发时使用Cmake Tools时输出Log乱码以及CPP文件乱码的终极解决方案

在Windows11上使用VSCode开发C程序的时候&#xff0c;由于使用到了Cmake Tools插件&#xff0c;在编译运行的时候&#xff0c;会出现输出日志乱码的情况&#xff0c;那么如何解决呢&#xff1f; 这里提供了解决方案&#xff1a; 当Settings里的Cmake: Output Log Encoding里设…

Solidity入门: 函数

函数 Solidity语言的函数非常灵活&#xff0c;可以进行各种复杂操作。在本教程中&#xff0c;我们将会概述函数的基础概念&#xff0c;并通过一些示例演示如何使用函数。 我们先看一下 Solidity 中函数的形式: function <function name>(<parameter types>) {in…

基于 Python 自动化接口测试(踩坑与实践)

文档&#xff1a;基于 Python 的自动化接口测试 目录 背景问题描述与解决思路核心代码修改点及其详细解释最终测试结果后续优化建议 1. 问题背景 本项目旨在使用 Python 模拟浏览器的请求行为&#xff0c;测试文章分页接口的可用性。测试目标接口如下&#xff1a; bashcoder…

Spring Boot教程之五十一:Spring Boot – CrudRepository 示例

Spring Boot – CrudRepository 示例 Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是…

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理

web-app uniapp监测屏幕大小的变化对数组一行展示数据作相应处理 1.uni.getSystemInfoSync().screenWidth; 获取屏幕宽度 2.uni.onWindowResize&#xff08;&#xff09; 实时监测屏幕宽度变化 3.根据宽度的大小拿到每行要展示的数量itemsPerRow 4.为了确保样式能够根据 items…

使用强化学习训练神经网络玩俄罗斯方块

一、说明 在 2024 年暑假假期期间&#xff0c;Tim学习并应用了Q-Learning &#xff08;一种强化学习形式&#xff09;来训练神经网络玩简化版的俄罗斯方块游戏。在本文中&#xff0c;我将详细介绍我是如何做到这一点的。我希望这对任何有兴趣将强化学习应用于新领域的人有所帮助…

计算机网络 (32)用户数据报协议UDP

前言 用户数据报协议&#xff08;UDP&#xff0c;User Datagram Protocol&#xff09;是计算机网络中的一种重要传输层协议&#xff0c;它提供了无连接的、不可靠的、面向报文的通信服务。 一、基本概念 UDP协议位于传输层&#xff0c;介于应用层和网络层之间。它不像TCP那样提…

如何将 DotNetFramework 项目打包成 NuGet 包并发布

如何将 DotNetFramework 项目打包成 NuGet 包并发布 在软件开发过程中&#xff0c;将项目打包成 NuGet 包并发布到 NuGet 库&#xff0c;可以让其他开发者方便地引用和使用你的项目成果。以下是将 WixWPFWizardBA 项目打包成 NuGet 包并发布的详细步骤&#xff1a; 1. 创建 .n…