news 2026/4/23 11:52:59

华为OD机考双机位C卷 - 游戏分组(Java Python JS C/C++ GO )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机考双机位C卷 - 游戏分组(Java Python JS C/C++ GO )

最新华为上机考试

真题目录:点击查看目录

华为OD面试真题精选:点击立即查看
华为OD机考双机位C卷 - 游戏分组

题目描述

有n(n为2到24之间的偶数,包含2和24)位玩家参与一款在线对战游戏,游戏服务器会将玩家分为两组进行对战,每组人数为n/2。每位玩家都有一个战斗力,代表着这位玩家的厉害程度。为了对战尽可能精彩,分组时要做到两组的战斗力相差最小(每组的战斗力为组内玩家战斗力之和)。现在,给你n位玩家的战斗力,把他们分为战斗力相差最小的两组。请你输出这两组的战斗力差。

输入描述

n个整数,n为2到24之间的偶数(包含2和24),整数之间用空格分隔。每个整数均为0和500000000之间的数字(包含0和500000000),每个整数为一位玩家的战斗力值

输出描述

两组最小的战斗力差,整数

示例1

输入

1 2 3 4 5 6 7 8 9 10

输出

1

说明

示例2

输入

500 700 0 0

输出

200

说明

解题思路

Java

importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassMain{// 全局变量用于存储最小差值,初始化为最大长整型staticlongminDiff=Long.MAX_VALUE;staticlongtotalSum=0;staticintn;staticinttargetCount;// 每组需要的人数 (n/2)staticlong[]nums;// 存储玩家战斗力publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);// 读取输入// 题目描述输入为一行空格分隔的整数,我们将其读取到列表中List<Long>inputList=newArrayList<>();if(scanner.hasNextLine()){String[]parts=scanner.nextLine().trim().split("\\s+");for(Stringpart:parts){if(!part.isEmpty()){inputList.add(Long.parseLong(part));}}}// 初始化数据n=inputList.size();targetCount=n/2;nums=newlong[n];for(inti=0;i<n;i++){nums[i]=inputList.get(i);totalSum+=nums[i];}// 开始深度优先搜索// 参数:当前索引,已选人数,当前和dfs(0,0,0);// 输出结果System.out.println(minDiff);}/** * 深度优先搜索所有组合 * @param index 当前考虑的玩家索引 * @param count 当前已选入第一组的玩家数量 * @param currentSum 当前第一组的战斗力总和 */publicstaticvoiddfs(intindex,intcount,longcurrentSum){// 剪枝条件1:如果已经选够了 n/2 个人if(count==targetCount){// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 = |currentSum - (totalSum - currentSum)| = |2 * currentSum - totalSum|longdiff=Math.abs(2*currentSum-totalSum);// 更新最小差值if(diff<minDiff){minDiff=diff;}return;}// 剪枝条件2:如果剩余的可选人数不足以凑齐 targetCount,直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if((n-index)<(targetCount-count)){return;}// 策略1:选择当前玩家进入第一组dfs(index+1,count+1,currentSum+nums[index]);// 策略2:不选当前玩家进入第一组(即归入第二组)// 这里有个小优化:如果 diff 已经为 0,没必要继续搜了(虽然上面的逻辑没加,但在极值情况下会稍快)if(minDiff>0){dfs(index+1,count,currentSum);}}}

Python

importsys# 全局变量用于存储最小差值,初始化为最大长整型min_diff=sys.maxsize total_sum=0n=0target_count=0# 每组需要的人数 (n/2)nums=[]# 存储玩家战斗力defdfs(index,count,current_sum):globalmin_diff,total_sum,n,target_count,nums# 剪枝条件1:如果已经选够了 n/2 个人ifcount==target_count:# 计算两组的差值# 第一组和为 current_sum# 第二组和为 total_sum - current_sum# 差值 = |current_sum - (total_sum - current_sum)| = |2 * current_sum - total_sum|diff=abs(2*current_sum-total_sum)# 更新最小差值ifdiff<min_diff:min_diff=diffreturn# 剪枝条件2:如果剩余的可选人数不足以凑齐 target_count,直接返回# (n - index) 是剩余可遍历的元素个数# (target_count - count) 是还需要选的元素个数if(n-index)<(target_count-count):return# 策略1:选择当前玩家进入第一组dfs(index+1,count+1,current_sum+nums[index])# 策略2:不选当前玩家进入第一组(即归入第二组)# 这里有个小优化:如果 diff 已经为 0,没必要继续搜了ifmin_diff>0:dfs(index+1,count,current_sum)defmain():globaltotal_sum,n,target_count,nums,min_diff# 读取输入input_list=list(map(int,input().split()))# 初始化数据n=len(input_list)target_count=n//2nums=input_list total_sum=sum(nums)# 开始深度优先搜索dfs(0,0,0)# 输出结果print(min_diff)if__name__=="__main__":main()

JavaScript

constreadline=require('readline');// 全局变量用于存储最小差值,初始化为最大长整型letminDiff=Number.MAX_SAFE_INTEGER;lettotalSum=0;letn=0;lettargetCount=0;// 每组需要的人数 (n/2)letnums=[];// 存储玩家战斗力/** * 深度优先搜索所有组合 * @param {number} index 当前考虑的玩家索引 * @param {number} count 当前已选入第一组的玩家数量 * @param {number} currentSum 当前第一组的战斗力总和 */functiondfs(index,count,currentSum){// 剪枝条件1:如果已经选够了 n/2 个人if(count===targetCount){// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 = |currentSum - (totalSum - currentSum)| = |2 * currentSum - totalSum|constdiff=Math.abs(2*currentSum-totalSum);// 更新最小差值if(diff<minDiff){minDiff=diff;}return;}// 剪枝条件2:如果剩余的可选人数不足以凑齐 targetCount,直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if((n-index)<(targetCount-count)){return;}// 策略1:选择当前玩家进入第一组dfs(index+1,count+1,currentSum+nums[index]);// 策略2:不选当前玩家进入第一组(即归入第二组)// 这里有个小优化:如果 diff 已经为 0,没必要继续搜了if(minDiff>0){dfs(index+1,count,currentSum);}}constrl=readline.createInterface({input:process.stdin,output:process.stdout});rl.question('',(input)=>{// 读取输入nums=input.trim().split(/\s+/).map(Number);// 初始化数据n=nums.length;targetCount=Math.floor(n/2);totalSum=nums.reduce((a,b)=>a+b,0);// 开始深度优先搜索dfs(0,0,0);// 输出结果console.log(minDiff);rl.close();});

C++

#include<iostream>#include<vector>#include<string>#include<sstream>#include<climits>#include<cmath>// 全局变量用于存储最小差值,初始化为最大长整型longlongminDiff=LLONG_MAX;longlongtotalSum=0;intn;inttargetCount;// 每组需要的人数 (n/2)std::vector<longlong>nums;// 存储玩家战斗力/** * 深度优先搜索所有组合 * @param index 当前考虑的玩家索引 * @param count 当前已选入第一组的玩家数量 * @param currentSum 当前第一组的战斗力总和 */voiddfs(intindex,intcount,longlongcurrentSum){// 剪枝条件1:如果已经选够了 n/2 个人if(count==targetCount){// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 = |currentSum - (totalSum - currentSum)| = |2 * currentSum - totalSum|longlongdiff=std::abs(2*currentSum-totalSum);// 更新最小差值if(diff<minDiff){minDiff=diff;}return;}// 剪枝条件2:如果剩余的可选人数不足以凑齐 targetCount,直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if((n-index)<(targetCount-count)){return;}// 策略1:选择当前玩家进入第一组dfs(index+1,count+1,currentSum+nums[index]);// 策略2:不选当前玩家进入第一组(即归入第二组)// 这里有个小优化:如果 diff 已经为 0,没必要继续搜了if(minDiff>0){dfs(index+1,count,currentSum);}}intmain(){std::string line;std::getline(std::cin,line);std::istringstreamiss(line);longlongnum;// 读取输入while(iss>>num){nums.push_back(num);}// 初始化数据n=nums.size();targetCount=n/2;for(longlongnum:nums){totalSum+=num;}// 开始深度优先搜索dfs(0,0,0);// 输出结果std::cout<<minDiff<<std::endl;return0;}

Go

packagemainimport("fmt""math""strings""strconv")// 全局变量用于存储最小差值,初始化为最大长整型varminDiffint64=math.MaxInt64vartotalSumint64varnintvartargetCountint// 每组需要的人数 (n/2)varnums[]int64// 存储玩家战斗力/** * 深度优先搜索所有组合 * @param index 当前考虑的玩家索引 * @param count 当前已选入第一组的玩家数量 * @param currentSum 当前第一组的战斗力总和 */funcdfs(index,countint,currentSumint64){// 剪枝条件1:如果已经选够了 n/2 个人ifcount==targetCount{// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 = |currentSum - (totalSum - currentSum)| = |2 * currentSum - totalSum|diff:=int64(math.Abs(float64(2*currentSum-totalSum)))// 更新最小差值ifdiff<minDiff{minDiff=diff}return}// 剪枝条件2:如果剩余的可选人数不足以凑齐 targetCount,直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if(n-index)<(targetCount-count){return}// 策略1:选择当前玩家进入第一组dfs(index+1,count+1,currentSum+nums[index])// 策略2:不选当前玩家进入第一组(即归入第二组)// 这里有个小优化:如果 diff 已经为 0,没必要继续搜了ifminDiff>0{dfs(index+1,count,currentSum)}}funcmain(){varinputstringfmt.Scanln(&input)// 读取输入strNums:=strings.Fields(input)nums=make([]int64,len(strNums))fori,s:=rangestrNums{nums[i],_=strconv.ParseInt(s,10,64)totalSum+=nums[i]}// 初始化数据n=len(nums)targetCount=n/2// 开始深度优先搜索dfs(0,0,0)// 输出结果fmt.Println(minDiff)}

C语言

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<limits.h>#include<math.h>// 全局变量用于存储最小差值,初始化为最大长整型longlongminDiff=LLONG_MAX;longlongtotalSum=0;intn;inttargetCount;// 每组需要的人数 (n/2)longlong*nums;// 存储玩家战斗力/** * 深度优先搜索所有组合 * @param index 当前考虑的玩家索引 * @param count 当前已选入第一组的玩家数量 * @param currentSum 当前第一组的战斗力总和 */voiddfs(intindex,intcount,longlongcurrentSum){// 剪枝条件1:如果已经选够了 n/2 个人if(count==targetCount){// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 = |currentSum - (totalSum - currentSum)| = |2 * currentSum - totalSum|longlongdiff=llabs(2*currentSum-totalSum);// 更新最小差值if(diff<minDiff){minDiff=diff;}return;}// 剪枝条件2:如果剩余的可选人数不足以凑齐 targetCount,直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if((n-index)<(targetCount-count)){return;}// 策略1:选择当前玩家进入第一组dfs(index+1,count+1,currentSum+nums[index]);// 策略2:不选当前玩家进入第一组(即归入第二组)// 这里有个小优化:如果 diff 已经为 0,没必要继续搜了if(minDiff>0){dfs(index+1,count,currentSum);}}intmain(){charline[10000];fgets(line,sizeof(line),stdin);// 计算输入数字的个数n=0;char*token=strtok(line," \n");while(token!=NULL){n++;token=strtok(NULL," \n");}// 分配内存nums=(longlong*)malloc(n*sizeof(longlong));// 重新读取数字inti=0;token=strtok(line," \n");while(token

文章目录

  • 最新华为上机考试
  • 题目描述
  • 输入描述
  • 输出描述
  • 示例1
  • 示例2
  • 解题思路
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:51:31

永磁同步电机谐波注入补偿Simulink模型仿真:5次与7次电流谐波抑制

永磁同步电机的谐波注入补偿simulink模型仿真/5次7次电流谐波抑制&#xff1b;在永磁同步电机&#xff08;PMSM&#xff09;的运行过程中&#xff0c;电流谐波会带来诸如转矩脉动、效率降低以及电机发热等一系列问题。其中&#xff0c;5次和7次电流谐波是较为常见且影响较大的成…

作者头像 李华
网站建设 2026/4/23 11:52:12

GIS开发:基于OpenLayers的全国公司分布统计与查询系统探索

GIS开发openlayers基于webgis的全国公司分布统计以及查询系统 适合对象&#xff1a;gis初学者&#xff0c;爱好者 这个系统采用的webgis技术是openlayersgeoserver&#xff0c;开发工具vs2012。 备注&#xff1a;前端项目&#xff0c;没有后端&#xff0c;后台接口调用在线模式…

作者头像 李华
网站建设 2026/4/16 2:54:57

PSO优化SVM实现时间序列预测:从理论到实践

PSO优化SVM做时间序列预测分析&#xff0c;代码内注释详细&#xff0c;直接替换数据就可以使用在数据挖掘和预测领域&#xff0c;时间序列预测一直是个热门话题。支持向量机&#xff08;SVM&#xff09;以其出色的泛化能力在时间序列预测中有着广泛应用。然而&#xff0c;SVM的…

作者头像 李华
网站建设 2026/4/23 11:50:18

导师严选2026 AI论文软件TOP9:本科生毕业论文必备测评

导师严选2026 AI论文软件TOP9&#xff1a;本科生毕业论文必备测评 2026年AI论文写作工具测评&#xff1a;为何需要这份榜单&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI论文软件提升写作效率与学术质量。然而&#xff0c;面对市场上种类繁多…

作者头像 李华
网站建设 2026/4/18 10:45:46

从局域网到随处可用:cpolar让Leanote 用户的真实体验升级

Leanote 的核心功能很扎实&#xff1a;它像一个多功能的数字笔记本&#xff0c;能写 Markdown 格式的文档&#xff0c;能插入复杂的数学公式&#xff0c;还能把文字大纲一键转成思维导图。无论是整理技术文档、课程笔记&#xff0c;还是搭建个人知识库&#xff0c;它都能胜任&a…

作者头像 李华