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

devtools/2025/1/14 13:48:05/

pythonjavacjsc_0">【华为OD-E卷 - 篮球比赛 100分(pythonjava、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_39">python解法

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

思路分析:

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

python">from itertools import combinationsdef 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_79">java解法

  • 解题思路

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

java">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)来减少计算量。

javascript">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) { // 如果当前子集的大小达到5result.push(partialSum); // 将当前子集的和加入结果数组return; // 结束当前递归}// 遍历数组中的每个元素,从 start 开始for (let i = start; i < arr.length; i++) {findCombinations(arr, i + 1, depth + 1, partialSum + arr[i], result); // 递归:选择当前元素,更新索引、深度和子集和}
}

注意:

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


http://www.ppmy.cn/devtools/150420.html

相关文章

【PPTist】插入形状、插入图片、插入图表

一、插入形状 插入形状有两种情况&#xff0c;一种是插入固定的形状&#xff0c; 一种是插入自定义的形状。 插入固定的形状时&#xff0c;跟上一篇文章 绘制文本框 是一样一样的&#xff0c;都是调用的 mainStore.setCreatingElement() 方法&#xff0c;只不多传的类型不一…

PHP语言的学习路线

PHP语言的学习路线 PHP&#xff08;Hypertext Preprocessor&#xff09;是一种广泛使用的开源服务器端脚本语言&#xff0c;尤其适用于Web开发。由于其易学易用、功能强大&#xff0c;PHP成为了许多动态网站和Web应用程序开发的首选语言。随着Web3.0和云计算的兴起&#xff0c…

【数据仓库】— 5分钟浅谈数据仓库(适合新手)从理论到实践

大家好&#xff0c;我是摇光~ 对于刚进入大数据领域的萌新&#xff0c;且想要在数据分析岗、数据运维岗、数据工程师这些岗位立足&#xff0c;了解数据仓库是必要的&#xff0c;接下来我尽量用通俗易懂的语言让大家了解到数据仓库。 在当今大数据盛行的时代&#xff0c;数据仓…

支持selenium的chrome driver更新到131.0.6778.264

最近chrome释放新版本&#xff1a;131.0.6778.264 如果运行selenium自动化测试出现以下问题&#xff0c;是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

Ubuntu 20.04 安装Cuda 12.2版本踩坑记录

Ubuntu 20.04 安装Cuda 12.2版本踩坑记录 文章目录 Ubuntu 20.04 安装Cuda 12.2版本踩坑记录查看Ubuntu版本不成功的方式&#xff1a;使用deb安装卸载现有的 NVIDIA 驱动&#xff1a;安装符合要求的驱动版本&#xff1a; 成功的安装方式&#xff1a;使用runfile安装user账户nvc…

macOS 版本对应 Xcode 版本,以及 Xcode 历史版本下载

注&#xff1a;当前页面的所有Xcode下载链接均为苹果官方下载链接 &#xff0c;点击将直接转至苹果官网下载。❤️❤️❤️ Xcode官网&#xff1a;Xcode Releases | xcodereleases.com Xcode版本Xcode发布时间对应macOS版本macOS SDKsiOS SDKswatchOS SDKstvOS SDKs下载Xcode发…

提升租赁效率的租赁小程序全解析

内容概要 在如今快节奏的生活中&#xff0c;租赁小程序俨然成为了提升租赁效率的一把利器。无论是个人还是企业&#xff0c;都会因其便捷的功能而受益。简单来说&#xff0c;租赁小程序能让繁琐的租赁流程变得轻松、高效。在这里&#xff0c;我们将带您畅游租赁小程序的海洋&a…

例子:WeTextProcessing,如何查看现在已安装的这个模块的版本号呢?查看虚拟环境中模块的版本

要查看已安装的`WeTextProcessing`模块的版本号,您可以使用以下几种方法: 1.使用`pip`命令 在命令行中,您可以使用`pip`命令来查看已安装包的版本信息。运行以下命令: ```sh pip show WeTextProcessing ``` 这将显示`WeTextProcessing`的详细信息,包括版本号。 2.使用`c…