【OD】【E卷】【真题】【100分】游戏分组王者荣耀(PythonJavaJavaScriptC++C)

题目描述

2020年题:

英雄联盟是一款十分火热的对战类游戏。每一场对战有10位玩家参与,分为两组,每组5人。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,我们需要把玩家们分为实力尽量相等的两组。一组的实力可以表示为这一组5位玩家的战斗力和。现在,给你10位玩家的战斗力,请你把他们分为实力尽量相等的两组。请你输出这两组的实力差。

2023年题:

部门准备举办一场王者荣耀表演赛,有10名游戏爱好者参与,分5为两队,每队5人。每位参与者都有一个评分,代表着他的游戏水平。为了表演赛尽可能精彩,我们需要把10名参赛者分为实力尽量相近的两队。一队的实力可以表示为这一队5名队员的评分总和。
现在给你10名参与者的游戏水平评分,请你根据上述要求分队最后输出这两组的实力差绝对值。
例: 10名参赛者的评分分别为5 1 8 3 4 6 710 9 2,分组为 (135 8 10) (24 679),两组实力差最小,差值为1。有多种分法,但实力差的绝对值最小为1。

输入描述

10个整数,表示10名参与者的游戏水平评分。范围在[1,10000]之间

输出描述

1个整数,表示分组后两组实力差绝对值的最小值.

用例1

输入:

1 2 3 4 5 6 7 8 9 10

输出:

1

说明:

10名队员分成两组,两组实力差绝对值最小为1.

解题思路

在这个问题中,我们通过深度优先搜索(DFS)尝试所有可能的分队方式,以找到实力差的绝对值最小的分队方案。整个算法的目标是遍历所有可能的组合,并计算出两队实力差的最小绝对值。

这里使用的深度优先搜索算法中,每一步都有两种选择:将当前玩家分配给第一队,或者不分配给第一队(即默认分配给第二队)。这样的策略保证了覆盖所有可能的分队方式。

解释代码段
// 为第一个队伍选择当前玩家
dfs(nums, idx + 1, count + 1, currentSum + nums[idx]);// 不为第一个队伍选择当前玩家
dfs(nums, idx + 1, count, currentSum);

这两行代码是DFS递归的核心,它们代表了在每一步有两种选择:

  1. 选择当前玩家加入第一队:这是通过dfs(nums, idx + 1, count + 1, currentSum + nums[idx]);实现的。这里idx + 1表示考虑下一个玩家,count + 1表示第一队的玩家数增加了1,currentSum + nums[idx]表示第一队的总评分增加了当前玩家的评分。

  2. 不选择当前玩家加入第一队:即留给第二队,通过dfs(nums, idx + 1, count, currentSum);实现。这里只将idx增加1,移动到下一个玩家,而countcurrentSum保持不变,因为没有新的玩家加入第一队。

整体逻辑
  • 初始时,totalSum计算了所有玩家的评分总和,targetSum是总和的一半。这是因为我们的目标是使两队的评分尽可能接近totalSum / 2
  • 通过DFS尝试所有可能的分队方式,每次递归都有两种选择:将当前玩家加入第一队或不加入。
  • 当一个队伍选满5名玩家时,计算两队的评分差,并更新最小差值res
  • 继续递归直到所有玩家都被考虑过,最终res会是实力差的最小绝对值。
剪枝优化

注释中提到的剪枝条件if (currentSum > targetSum) return;, 经过考友的反馈,去掉的话是100%的通过率,请各位机考时都加上去试试。

C++

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <climits>using namespace std;int res = INT_MAX;
int totalSum = 0;
int targetSum = 0;// 深度优先搜索函数
void dfs(vector<int>& nums, int idx, int count, int currentSum) {// 剪枝条件:如果当前总和超过目标,则停止 ,考友反馈,去掉可得100%// if (currentSum > targetSum) return;// 当我们为一个队伍选择了5名玩家时if (count == 5) {// 计算另一个队伍的总和int otherTeamSum = totalSum - currentSum;// 用较小的差值更新结果res = min(res, abs(currentSum - otherTeamSum));return;}// 如果我们已经考虑了所有玩家,停止递归if (idx == 10) return;// 为第一个队伍选择当前玩家dfs(nums, idx + 1, count + 1, currentSum + nums[idx]);// 不为第一个队伍选择当前玩家dfs(nums, idx + 1, count, currentSum);
}int main() {vector<int> nums(10);for (int i = 0; i < 10; ++i) {cin >> nums[i];totalSum += nums[i];}targetSum = totalSum / 2;dfs(nums, 0, 0, 0);cout << res << endl;return 0;
}

Java

import java.util.*;public class Main {static int res = Integer.MAX_VALUE;static int totalSum = 0;static int targetSum = 0;public static void main(String[] args) {Scanner cin = new Scanner(System.in);int[] nums = Arrays.stream(cin.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();for (int num : nums) {totalSum += num;}targetSum = totalSum / 2;dfs(nums, 0, 0, 0);System.out.println(res);cin.close();}static void dfs(int[] nums, int idx, int count, int currentSum) {// 剪枝条件:如果当前总和超过目标,则停止.考友反馈,去掉可得100%// if (currentSum > targetSum) return;// 当我们为一个队伍选择了5名玩家时if (count == 5) {// 计算另一个队伍的总和int otherTeamSum = totalSum - currentSum;// 用较小的差值更新结果res = Math.min(res, Math.abs(currentSum - otherTeamSum));return;}// 如果我们已经考虑了所有玩家,停止递归if (idx == 10) return;// 为第一个队伍选择当前玩家dfs(nums, idx + 1, count + 1, currentSum + nums[idx]);// 不为第一个队伍选择当前玩家dfs(nums, idx + 1, count, currentSum);}
}

javaScript

const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let res = Number.MAX_SAFE_INTEGER;
let totalSum = 0;
let targetSum = 0;// 深度优先搜索函数
function dfs(nums, idx, count, currentSum) {// 剪枝条件:如果当前总和超过目标,则停止 考友反馈,去掉可得100%// if (currentSum > targetSum) return;// 当我们为一个队伍选择了5名玩家时if (count === 5) {// 计算另一个队伍的总和let otherTeamSum = totalSum - currentSum;// 用较小的差值更新结果res = Math.min(res, Math.abs(currentSum - otherTeamSum));return;}// 如果我们已经考虑了所有玩家,停止递归if (idx === 10) return;// 为第一个队伍选择当前玩家dfs(nums, idx + 1, count + 1, currentSum + nums[idx]);// 不为第一个队伍选择当前玩家dfs(nums, idx + 1, count, currentSum);
}rl.on('line', (input) => {let nums = input.split(' ').map(Number);for (let num of nums) {totalSum += num;}targetSum = totalSum / 2;dfs(nums, 0, 0, 0);console.log(res);rl.close();
});

Python

import sysres = sys.maxsize
totalSum = 0
targetSum = 0# 深度优先搜索函数
def dfs(nums, idx, count, currentSum):global res, totalSum, targetSum# 剪枝条件:如果当前总和超过目标,则停止.考友反馈,去掉可得100%# if currentSum > targetSum:#    return# 当我们为一个队伍选择了5名玩家时if count == 5:# 计算另一个队伍的总和otherTeamSum = totalSum - currentSum# 用较小的差值更新结果res = min(res, abs(currentSum - otherTeamSum))return# 如果我们已经考虑了所有玩家,停止递归if idx == 10:return# 为第一个队伍选择当前玩家dfs(nums, idx + 1, count + 1, currentSum + nums[idx])# 不为第一个队伍选择当前玩家dfs(nums, idx + 1, count, currentSum)nums = list(map(int, input().split()))
for num in nums:totalSum += num
targetSum = totalSum // 2
dfs(nums, 0, 0, 0)
print(res)

C语言

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>int res = INT_MAX;
int totalSum = 0;
int targetSum = 0;// 深度优先搜索函数
void dfs(int nums[10], int idx, int count, int currentSum) {// 剪枝条件:如果当前总和超过目标,则停止.考友反馈,去掉可得100%// if (currentSum > targetSum) return;// 当我们为一个队伍选择了5名玩家时if (count == 5) {// 计算另一个队伍的总和int otherTeamSum = totalSum - currentSum;// 用较小的差值更新结果res = abs(currentSum - otherTeamSum) < res ? abs(currentSum - otherTeamSum) : res;return;}// 如果我们已经考虑了所有玩家,停止递归if (idx == 10) return;// 为第一个队伍选择当前玩家dfs(nums, idx + 1, count + 1, currentSum + nums[idx]);// 不为第一个队伍选择当前玩家dfs(nums, idx + 1, count, currentSum);
}int main() {int nums[10];for (int i = 0; i < 10; ++i) {scanf("%d", &nums[i]);totalSum += nums[i];}targetSum = totalSum / 2;dfs(nums, 0, 0, 0);printf("%d\n", res);return 0;
}

完整用例

用例1

1 1 1 1 1 1 1 1 1 1

用例2

1 2 3 4 5 6 7 8 9 10

用例3

10 9 8 7 6 5 4 3 2 1

用例4

1 1 1 1 1 10000 10000 10000 10000 10000

用例5

4500 4600 4700 4800 4900 5100 5200 5300 5400 5500

用例6

1000 1000 1000 1000 1000 9000 9000 9000 9000 9000

用例7

1234 5678 910 1112 1314 1516 789 2345 6789 34

用例8

1000 900 800 700 600 500 400 300 200 100

用例9

1000 3000 5000 7000 9000 2000 4000 6000 8000 10000

用例10

5000 5000 4000 4000 3000 3000 2000 2000 1000 1000

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

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

相关文章

学习文档(5)

Redis应用 目录 Redis应用 Redis 除了做缓存&#xff0c;还能做什么&#xff1f; Redis 可以做消息队列么&#xff1f; Redis 可以做搜索引擎么&#xff1f; 如何基于 Redis 实现延时任务&#xff1f; Redis 除了做缓存&#xff0c;还能做什么&#xff1f; 分布式锁&…

AI‘林黛玉发疯文学’火了!40篇笔记涨粉30万,这是怎么做到的?五步教你!

本文背景 最近老刷到林黛玉那种阴阳怪气的“发疯文学”视频呢。在 小红书 搜了搜相关话题&#xff0c;嘿&#xff0c;带“#林黛玉”的话题浏览量有 9.8 亿之多&#xff0c;像“#林黛玉发疯文学”的标签浏览量也有七千多万次&#xff0c;“林黛玉倒拔垂杨柳”都有 1332 万次浏览…

Java--集合(三)之vectorlinkedlisthashset结构

文章目录 0.架构图1.vector解析2.LinkedList分析2.1源码分析2.2迭代器遍历的三种方式 3.set接口的使用方法3.1基本使用说明3.2基本遍历方式3.3HashSet引入3.4数组链表模拟3.5hashset扩容机制3.6hashset源码解读3.7扩容*转成红黑树机制**我的理解 0.架构图 1.vector解析 和之前介…

mysql 10 单表访问方法

01.优化的过程 对于我们这些 MySQL 的使用者来说&#xff0c; MySQL 其实就是一个软件&#xff0c;平时用的最多的就是查询功能。DBA时不时丢过来一些慢查询语句让优化&#xff0c;我们如果连查询是怎么执行的都不清楚还优化个毛线&#xff0c;所以是时候掌握真正的技术了。我…

Jupyter notebook中更改字体大小

文章目录 方法一&#xff1a;局部修改方法二&#xff1a;全局修改 Jupyter notebook提供了一个非常方便的跨平台交互代码编译环境&#xff0c;但是单元格的内的代码字体往往显示较小&#xff0c;不利于观看。本人查了很多方法来调整字体&#xff0c;后来发现既不需要更改jupyte…

HCIP-HarmonyOS Application Developer 习题(十二)

&#xff08;多选&#xff09;1、声明式开发范式的转场动画包含以下哪几种类型? A、页面间转场 B、应用间转场 C、共享元素转场 D、组件内转场 答案&#xff1a;ACD 分析&#xff1a; &#xff08;多选&#xff09;2、公共事件服务为应用程序提供哪些能力。 A、取消发布公共…

vue day08(vuex)

一、vuex 概述 1. 是什么 vuex 是一个 vue 的状态管理工具&#xff0c;状态就是数据 大白话&#xff1a;vuex 是一个插件&#xff0c;可以帮我们管理 vue 通用的数据&#xff08;多组件共享的数据&#xff09; 2. 场景 一份数据在多个组件中使用&#xff0c;并且还可以进行数据…

Facebook的隐私之战:数据保护的挑战与未来

在数字化时代&#xff0c;隐私保护成为了公众关注的焦点&#xff0c;尤其是在社交媒体巨头Facebook身上。随着用户数据泄露事件的频发&#xff0c;Facebook面临着日益严峻的隐私挑战。这些挑战不仅涉及法律法规的遵循&#xff0c;还影响着用户信任、公司声誉以及未来的发展方向…

【智能大数据分析 | 实验四】Spark实验:Spark Streaming

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

Chromium127编译指南 Windows篇 - 关键环境变量的设置(三)

前言 在我们的Chromium编译指南系列中&#xff0c;我们已经探讨了初始准备工作和 depot_tools 工具的配置。本篇文章将聚焦于Chromium编译过程中至关重要的环境变量设置&#xff0c;这些设置将为您的编译工作铺平道路。 1. 配置 DEPOT_TOOLS_WIN_TOOLCHAIN 环境变量 为了确保我…

vue综合指南(二)

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vuet篇专栏内容:vue综合指南(二) 目录 21、介绍虚拟DOM 22、vue生命周期的理解 23、vue父组件向子组件传递数据…

如何用VS实现动态爱心

首先下载一个easyx库 其次输入以下代码&#xff1a; 代码1 //#define _CRT_SECURE_NO_WARNINGS 1#include<easyx.h>//图形库 #include<stdio.h> #include<time.h> #include<math.h>//定义一个结构体 struct point {double x, y;COLORREF color; };COL…

瀚海微SD NAND存储功能描述(15)命令类b

1)传输的数据不得跨越物理块边界&#xff0c;除非在CSD中设置了WRITE BLK MISALIGN。如果不支持写部分块&#xff0c;则块长度-默认块长度(在CSD中给出)1 2) SDSC卡(CCS0)使用字节单位地址&#xff0c;SDHC和SDXC卡(CCS1)使用块单位地址(512字节单位)。 1) 32个写保护位(代表…

汽车行业焕新潮流涌动,联众优车以优质服务响应市场变化

随着消费者环保意识的改变及新能源汽车市场的快速发展&#xff0c;我国新能源汽车领域正掀起一股新的消费热潮&#xff0c;而旧车的合理处置问题也随之成为社会各界关注的焦点。今年4月末&#xff0c;商务部、财政部等七大部委携手颁布了《老旧汽车置换补贴实施指南》(以下简称…

Maven--简略

简介 Apache旗下的一款开源项目&#xff0c;用来进行项目构建&#xff0c;帮助开发者管理项目中的jar及jar包之间的依赖&#xff0c;还拥有项目编译、测试、打包的功能。 管理方式 统一建立一个jar仓库&#xff0c;把jar上传至统一的仓库&#xff0c;使用时&#xff0c;配置…

深入理解MySQL InnoDB中的B+索引机制

目录 一、InnoDB中的B 树索引介绍 二、聚簇索引 &#xff08;一&#xff09;使用记录主键值的大小进行排序 页内记录排序 页之间的排序 目录项页的排序 &#xff08;二&#xff09;叶子节点存储完整的用户记录 数据即索引 自动创建 &#xff08;三&#xff09;聚簇索引…

[ES3]大侠立志传存档解密修改

找到存档位置&#xff0c;如果是PC端用户&#xff1a;C:\Users\你自己的用户名\AppData\LocalLow\DefaultCompany\Wulin\一串steamID\选择你要改的存档 这里你要改的存档如果是AutoSave就是自动保存&#xff0c;如果是Save加序号就是你手动保存的存档。 手机端用户自行查其他资…

模拟键盘输入卡号RFID读卡器银河麒麟桌面操作系统兼容适配认证测试报告

本测试报告使用读卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1b72i5j0&ftt&id702441469725

通过无线路由器连接三菱PLC的设置方法

1.首先设置无线路由器上网方式为DHCP&#xff08;自动获取IP地址&#xff09;。点击保存&#xff0c;然后点击更多功能 2.再点击网络设置-局域网&#xff0c;勾选DHCP服务器&#xff0c;此功能的作用是对局域网内所有设备分配IP地址。 然后保存&#xff1b; 3.再点击系统设置…

【论文笔记】Fine-tuned CLIP Models are Efficient Video Learners

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Fine-tuned CLIP Models a…