华为OD机考算法题:篮球比赛

目录

题目部分

解读与分析

代码实现


题目部分

题目篮球比赛
难度
题目说明篮球(5V5)比赛中,每个球员拥有一个战斗力,每个队伍的所有球员战斗力之和为该队伍的总体战斗力。现有 10 个球员准备分为两队进行训练赛,教练希望 2 个队伍的战斗力差值能够尽可能的小,以达到最佳训练效果。给出 10 个球员的战斗力,如果你是教练,你该如何分队,才能达到最佳训练效果?请说出该分队方案下的最小战斗力差值。
输入描述10 个篮球队员的战斗力(整数,范围[1,10000])战斗力之间用空格分隔,如:10 9 8 7 6 5 4 3 2 1。
不需要考虑异常输入的场景。
输出描述输出描述最小的战斗力差值,如:1。
补充说明
------------------------------------------------------
示例
示例1
输入10 9 8 7 6 5 4 3 2 1
输出1
说明1、2、5、9、10 分为一队,3、4、6、7、8分为一队,两队战斗力之差最小,输出差值1。备注:球员分队方案不唯一,但最小战斗力差值固定是1。


解读与分析

题目解读

10 个数字分成两组,每组 5 个数字,使两组数字之和的差值最小。请输出最小差值。 

分析与思路

本题与《华为OD机考算法题:MVP争夺战》类似,都是把数字分组,要求分组后的数字达到某种要求。不同的是,在《MVP争夺战》中,每组的数字个数是不定的,而在本题中,每组数字的个数是固定的,都是 5。相对而言,本题的思路和实现更简单。

从 10 个数中,穷尽所有的情况,每种情况计算一下两队的差值,找出差值最小的那个。

假设这两组分别为 A 组和 B 组,这 10 个数字分别为 T_{1}T_{2}……T_{10}
我们穷尽的顺序是,先把 T_{1} 放到 A 组,然后基于剩下的 9 个数字,采用相同的方法,穷尽 9 个数字取 4 个的所有可能情况。这样从 10 个数字中取 5 个的情况就降维成了 9 个数字取 4 个,同样的方法,最后可以降为成 6 个数字里取 1 个。
以上是 T_{1}  放到 A 组的情况,接下来就是 T_{2} 放到 A 组,然后从 T_{3} 到 T_{10} 这 8 个数字中,穷尽 8 个数字 取 4 个数字的所有可能情况。

每遍历一种情况,计算两组的数字之差(设为 diff)时,如果 diff 比之前遍历时计算的最小差(设为minDiff)更小,那么更新 minDiff 的值。遍历完所有情况后,最终求得的 minDiff 值即为题目所要求的输出。这种算法遍历的次数为 C_{10}^{5}

在以上的遍历算法中,存在重复计算的情况。题目只关心两组的差值,所以在任意一种组合,把 A 组的数字和 B 组的数字交换,可以看做是同一种情况。如 T_{1}T_{2}T_{3}T_{4}T_{5} 放到 A 组 与 T_{6}T_{7}T_{8}T_{9}T_{10} 放到 A 组其实是等同的。为了减少重复,我们可以假设 A 组的数字之和小于或等于 B 组的数字之和,即 A 组数字之和小于或等于所有数字之和(设为 sum)的一半。那么在穷举所有情况时,发现 A 组数字之和已经超过 (sum/2),那么就可以忽略这种组合了。这样可以减少一半遍历,遍历次数变为 \frac{C_{10}^{5}}{2}

既然需要保证A组数字之和小于或等于 (sum/2),我们可以先对数字进行从小到大排序,进一步减少遍历次数。

综上,此算法的遍历次数不超过 \frac{C_{10}^{5}}{2}。下面,我们计算一下最大遍历次数。

由组合计算公式 C_{m}^{n} = \frac{m!}{n!(m-n)!},可以得出  \frac{C_{10}^{5}}{2} = \frac{ 10!}{(5!)(5!)*2} = 126,最多不超过 126 次。


代码实现

Java代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;/*** 篮球比赛* @since 2023.09.15* @version 0.1* @author Frank**/
public class BasketballGame {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String input = sc.nextLine();String[] strNumbers = input.split( " " );// 此处 count == numbers.count,可以完全不用考虑 count.processBasketballGame( strNumbers );}}private static void processBasketballGame( String strNumbers[] ){Integer[] numbers = new Integer[strNumbers.length];int sum = 0;for( int i = 0; i < numbers.length; i ++ ){numbers[i] = Integer.parseInt( strNumbers[i] );sum += numbers[i];}Arrays.sort( numbers );int minDiff = sum;	// minDiff 一定小于 sumList<Integer> numList = new ArrayList<Integer>( Arrays.asList( numbers ) );minDiff = getMinDiff( sum, minDiff, 0, 0, numList );System.out.println( minDiff );}private static int getMinDiff( int SUM, int minDiff, int currentSum, int currentCnt, List<Integer> numbers ){			if( currentCnt + numbers.size() < 5 ){return SUM;}List<Integer> tmpRemovedNumber = new ArrayList<Integer>(); for( int i = 0; i < numbers.size(); i ++ ){int tmpMinDiff = SUM;int tmpNumber = numbers.get( i );int tmpCurrentSum = currentSum + tmpNumber;int tmpCurrentCnt = currentCnt + 1;if( tmpCurrentSum * 2 > SUM ){break; // 可以break,因为后面的数字更大。}if( tmpCurrentCnt == 5 ){tmpMinDiff = SUM - tmpCurrentSum * 2;if( tmpMinDiff < minDiff ){minDiff = tmpMinDiff;continue;}}tmpRemovedNumber.add( tmpNumber );numbers.remove( i );tmpMinDiff = getMinDiff( SUM, minDiff, tmpCurrentSum, tmpCurrentCnt, numbers );if( tmpMinDiff < minDiff ){minDiff = tmpMinDiff;}
//			numbers.add( i, tmpNumber );  // 不必加回去,可以减少一半的穷举数}		for( int i = 0; i < tmpRemovedNumber.size(); i ++ ){numbers.add( i, tmpRemovedNumber.get( i ) );}return minDiff;}}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {while (line = await readline()) {// count 可以忽略var strNumbers = line.split(" ");processBasketballGame(strNumbers);}
}();function processBasketballGame(strNumbers) {var numbers = new Array();var sum = 0;for (var i = 0; i < strNumbers.length; i++) {numbers[i] = parseInt(strNumbers[i]);sum += numbers[i];}numbers.sort();var minDiff = sum; // minDiff 一定小于 summinDiff = getMinDiff(sum, minDiff, 0, 0, numbers);console.log(minDiff);
}function getMinDiff(SUM, minDiff, currentSum, currentCnt, numbers) {if (currentCnt + numbers.length < 5) {return SUM;}var tmpRemovedNumber = new Array();for (var i = 0; i < numbers.length; i++) {var tmpMinDiff = SUM;var tmpNumber = numbers[i];var tmpCurrentSum = currentSum + tmpNumber;var tmpCurrentCnt = currentCnt + 1;if (tmpCurrentSum * 2 > SUM) {break; // 可以break,因为后面的数字更大。}if (tmpCurrentCnt == 5) {tmpMinDiff = SUM - tmpCurrentSum * 2;if (tmpMinDiff < minDiff) {minDiff = tmpMinDiff;continue;}}tmpRemovedNumber.push(tmpNumber);numbers.splice(i, 1);tmpMinDiff = getMinDiff(SUM, minDiff, tmpCurrentSum, tmpCurrentCnt, numbers);if (tmpMinDiff < minDiff) {minDiff = tmpMinDiff;}}for (var i = 0; i < tmpRemovedNumber.length; i++) {numbers.splice(i, 0, tmpRemovedNumber[i]);}return minDiff;
}

(完)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java深入理解线程的三大特性

目录 1 CPU缓存导致可见性问题2 线程切换导致原子性问题3 性能优化导致有序性问题4 JMM(Java Memory Model)5 volatile6 synchronized 1 CPU缓存导致可见性问题 线程的三大特性&#xff1a; 可见性&#xff1a;Visibility有序性&#xff1a;Ordering原子性&#xff1a;Atomic…

谈谈最近招人的感受!

最近折腾新的项目&#xff0c;面试了很多实习生小伙伴&#xff0c;我说说我的一些「面试」感受&#xff0c; 虽然是一个老生常谈的话题&#xff0c;但是依然提一下。 准时很重要&#xff1a;提前一点时间&#xff0c;踩个点&#xff0c;别迟到&#xff0c;面试的过程中由于每个…

2023年前端流行什么技术和框架了?

Web前端三大主流框架有React、Vue.js和Angular&#xff0c;由于接触过Vue.js&#xff0c;接下来主讲最新的Vue3.0&#xff01; Vue3.0作为最新版本的Vue.js框架&#xff0c;拥有更强大的性能和更丰富的功能&#xff0c;为低代码开发平台注入了全新的活力。而JNPF快速开发平台作…

浅谈xss

XSS 简介 XSS,全称Cross Site Scripting,即跨站脚本攻击,是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。需要强调的是,XSS不仅…

使用ElementUI结合Mock完成主页的搭建

目录 一、Mock ( 1 ) 讲述 ( 2 ) 作用 二、引用 三、主页搭建 学习后带来的收获 一、Mock ( 1 ) 讲述 Mock.js是一个用于前端开发中模拟数据的库。它可以帮助开发人员在前端开发过程中模拟接口返回的数据&#xff0c;从而实现前后端分离开发。Mock.js提供了一套简单易…

Python和Scrapy构建可扩展的框架

构建一个可扩展的网络爬虫框架是利用Python和Scrapy实现高效数据采集的重要技能。在本文中&#xff0c;我将为您介绍如何使用Python和Scrapy搭建一个强大灵活的网络爬虫框架。我们将按照以下步骤展开&#xff1a; 1. 安装Scrapy&#xff1a; 首先&#xff0c;确保您已经安装了…

如何计算3种卷积之后的尺寸(普通卷积,转置卷积,空洞卷积)

文章目录 前言一、普通卷积二、转置卷积三、空洞卷积 前言 三种卷积之后的feature map的尺寸如何计算。包括普通卷积&#xff0c;转置卷积&#xff0c;空洞卷积。可以在下面这个链接看到三种卷积的动态图。 卷积动态图 一、普通卷积 普通卷积比较简单了&#xff0c;其计算方式…

【python爬虫】爬虫所需要的爬虫代理ip是什么?

目录 前言 一、什么是爬虫代理 IP 二、代理 IP 的分类 1.透明代理 2.匿名代理 3.高匿代理 三、如何获取代理 IP 1.免费代理网站 2.付费代理服务 四、如何使用代理 IP 1.使用 requests 库 2.使用 scrapy 库 五、代理 IP 的注意事项 1.代理 IP 可能存在不稳定性 2…

DC电源模块的过热保护功能

BOSHIDA DC电源模块的过热保护功能 DC电源模块的过热保护功能是为了防止电源模块因长时间工作或外部环境因素导致的过热而损坏。在使用DC电源模块时&#xff0c;电源模块内部的电子元件会产生一定的热量&#xff0c;如果超过了元件所能承受的温度范围&#xff0c;就可能会发生…

【VsCode】vscode创建文件夹有小图标显示和配置

效果 步骤 刚安装软件后&#xff0c; 开始工作目录下是没有小图标显示的。 如下图操作&#xff0c;安装vscode-icons 插件&#xff0c;重新加载即可 创建文件夹&#xff0c;显示图标如下&#xff1a;

Jenkins学习笔记2

Jenkins下载安装&#xff1a; 从清华源开源镜像站上下载jenkins的安装包&#xff1a; 安装的是这个版本。 关于软件的版本&#xff0c;尽量使用LTS&#xff0c;长期支持。 首先是安装openjdk&#xff1a; yum install fontconfig java-11-openjdk[rootlocalhost soft]# java …

ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案

目录 一、DSL 查询文档语法 前言 1.1、DSL Query 基本语法 1.2、全文检索查询 1.2.1、match 查询 1.2.2、multi_match 1.3、精确查询 1.3.1、term 查询 1.3.2、range 查询 1.4、地理查询 1.4.1、geo_bounding_box 1.4.2、geo_distance 1.5、复合查询 1.5.1、相关…

ubuntu18.04安装docker

ubuntu18.04安装docker 文章目录 ubuntu18.04安装docker一.安装1.更新软件库索引2.安装一些必要的软件包3.添加Docker的官方GPG密钥4.添加Docker软件库5.再次更新软件库索引6.安装Docker CE7.启动Docker并设置开机启动8.验证Docker安装9.(若要让非root用户可以运行Docker命令)可…

【QT】QT事件Event大全

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT中的事件Event技术&#xff0c;主要从QT事件流程和常用QT事件方法等方面展开&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易…

如何搭建数据驱动自动化测试框架?

前言 说到数据驱动自动化测试&#xff0c;你会不会有这样的疑问&#xff1a;数据怎么管理&#xff1f;数据怎么才能驱动测试用例执行&#xff1f;到底怎么样才算数据驱动&#xff1f;那么本篇文章就教你如何进行数据驱动测试&#xff0c;相信你一定能对数据驱动自动化测试有一…

FlashDuty Changelog 2023-09-21 | 自定义字段和开发者中心

FlashDuty&#xff1a;一站式告警响应平台&#xff0c;前往此地址免费体验&#xff01; 自定义字段 FlashDuty 已支持接入大部分常见的告警系统&#xff0c;我们将推送内容中的大部分信息放到了 Lables 进行展示。尽管如此&#xff0c;我们用户还是会有一些扩展或定制性的需求…

网络安全--防火墙旁挂部署方式和高可靠性技术

目录 一、防火墙 二、防火墙旁挂部署方式 使用策略路由实现 第一步、IP地址配置 第二步、配置路由 第三步、在防火墙上做策略 第四步、在R2上使用策略路由引流 三、防火墙高可靠性技术--HRP 拓扑图 第一步、配置SW1、SW2、FW1、FW2 第二步、进入防火墙Web页面进行配…

基于Python的微博舆论分析,微博情感分析可视化系统(V2.0)

简介 Python基于微博的舆情分析&#xff0c;情感分析可视化系统 微博舆情分析系统&#xff0c;项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 功能包括 登陆注册用户管理热门事件展示舆情分析&#xff0c;包括舆情分析&#xff0c;情感分类&#xff0…

2023最新PS(photoshop)Win+Mac免费下载安装包及教程内置AI绘画-网盘下载

2023最新PS(photoshop)WinMac免费下载安装包及教程内置AI绘画-网盘下载 2023最新PS(photoshop)免费下载安装教程来咯&#xff5e; 「PhotoShop」全套&#xff0c;winmac&#xff1a; https://pan.quark.cn/s/9d8d8ef5c400#/list/share 所有版本都有 1&#xff0c;复制链接…

400G QSFP-DD FR4 与 400G QSFP-DD FR8光模块:哪个更适合您的网络需求?

QSFP-DD 光模块随着光通信市场规模的不断增长已成为400G市场中客户需求量最高的产品。其中400G QSFP-DD FR4和400G QSFP-DD FR8光模块都是针对波分中距离传输&#xff08;2km&#xff09;的解决方案&#xff0c;它们之间有什么不同&#xff1f;应该如何选择应用&#xff1f;飞速…