2026/4/18 8:58:05
网站建设
项目流程
仙居微信网站开发,杭州网络推广公司那家好,网站开发职业认知小结,上海网络推广平台最新华为上机考试
真题目录#xff1a;点击查看目录 华为OD面试真题精选#xff1a;点击立即查看 华为OD机考双机位C卷 - 游戏分组
题目描述
有n#xff08;n为2到24之间的偶数#xff0c;包含2和24#xff09;位玩家参与一款在线对战游戏#xff0c;游戏服务器会将玩…最新华为上机考试真题目录点击查看目录华为OD面试真题精选点击立即查看华为OD机考双机位C卷 - 游戏分组题目描述有nn为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说明解题思路Javaimportjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;publicclassMain{// 全局变量用于存储最小差值初始化为最大长整型staticlongminDiffLong.MAX_VALUE;staticlongtotalSum0;staticintn;staticinttargetCount;// 每组需要的人数 (n/2)staticlong[]nums;// 存储玩家战斗力publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);// 读取输入// 题目描述输入为一行空格分隔的整数我们将其读取到列表中ListLonginputListnewArrayList();if(scanner.hasNextLine()){String[]partsscanner.nextLine().trim().split(\\s);for(Stringpart:parts){if(!part.isEmpty()){inputList.add(Long.parseLong(part));}}}// 初始化数据ninputList.size();targetCountn/2;numsnewlong[n];for(inti0;in;i){nums[i]inputList.get(i);totalSumnums[i];}// 开始深度优先搜索// 参数当前索引已选人数当前和dfs(0,0,0);// 输出结果System.out.println(minDiff);}/** * 深度优先搜索所有组合 * param index 当前考虑的玩家索引 * param count 当前已选入第一组的玩家数量 * param currentSum 当前第一组的战斗力总和 */publicstaticvoiddfs(intindex,intcount,longcurrentSum){// 剪枝条件1如果已经选够了 n/2 个人if(counttargetCount){// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 |currentSum - (totalSum - currentSum)| |2 * currentSum - totalSum|longdiffMath.abs(2*currentSum-totalSum);// 更新最小差值if(diffminDiff){minDiffdiff;}return;}// 剪枝条件2如果剩余的可选人数不足以凑齐 targetCount直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if((n-index)(targetCount-count)){return;}// 策略1选择当前玩家进入第一组dfs(index1,count1,currentSumnums[index]);// 策略2不选当前玩家进入第一组即归入第二组// 这里有个小优化如果 diff 已经为 0没必要继续搜了虽然上面的逻辑没加但在极值情况下会稍快if(minDiff0){dfs(index1,count,currentSum);}}}Pythonimportsys# 全局变量用于存储最小差值初始化为最大长整型min_diffsys.maxsize total_sum0n0target_count0# 每组需要的人数 (n/2)nums[]# 存储玩家战斗力defdfs(index,count,current_sum):globalmin_diff,total_sum,n,target_count,nums# 剪枝条件1如果已经选够了 n/2 个人ifcounttarget_count:# 计算两组的差值# 第一组和为 current_sum# 第二组和为 total_sum - current_sum# 差值 |current_sum - (total_sum - current_sum)| |2 * current_sum - total_sum|diffabs(2*current_sum-total_sum)# 更新最小差值ifdiffmin_diff:min_diffdiffreturn# 剪枝条件2如果剩余的可选人数不足以凑齐 target_count直接返回# (n - index) 是剩余可遍历的元素个数# (target_count - count) 是还需要选的元素个数if(n-index)(target_count-count):return# 策略1选择当前玩家进入第一组dfs(index1,count1,current_sumnums[index])# 策略2不选当前玩家进入第一组即归入第二组# 这里有个小优化如果 diff 已经为 0没必要继续搜了ifmin_diff0:dfs(index1,count,current_sum)defmain():globaltotal_sum,n,target_count,nums,min_diff# 读取输入input_listlist(map(int,input().split()))# 初始化数据nlen(input_list)target_countn//2numsinput_list total_sumsum(nums)# 开始深度优先搜索dfs(0,0,0)# 输出结果print(min_diff)if__name____main__:main()JavaScriptconstreadlinerequire(readline);// 全局变量用于存储最小差值初始化为最大长整型letminDiffNumber.MAX_SAFE_INTEGER;lettotalSum0;letn0;lettargetCount0;// 每组需要的人数 (n/2)letnums[];// 存储玩家战斗力/** * 深度优先搜索所有组合 * param {number} index 当前考虑的玩家索引 * param {number} count 当前已选入第一组的玩家数量 * param {number} currentSum 当前第一组的战斗力总和 */functiondfs(index,count,currentSum){// 剪枝条件1如果已经选够了 n/2 个人if(counttargetCount){// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 |currentSum - (totalSum - currentSum)| |2 * currentSum - totalSum|constdiffMath.abs(2*currentSum-totalSum);// 更新最小差值if(diffminDiff){minDiffdiff;}return;}// 剪枝条件2如果剩余的可选人数不足以凑齐 targetCount直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if((n-index)(targetCount-count)){return;}// 策略1选择当前玩家进入第一组dfs(index1,count1,currentSumnums[index]);// 策略2不选当前玩家进入第一组即归入第二组// 这里有个小优化如果 diff 已经为 0没必要继续搜了if(minDiff0){dfs(index1,count,currentSum);}}constrlreadline.createInterface({input:process.stdin,output:process.stdout});rl.question(,(input){// 读取输入numsinput.trim().split(/\s/).map(Number);// 初始化数据nnums.length;targetCountMath.floor(n/2);totalSumnums.reduce((a,b)ab,0);// 开始深度优先搜索dfs(0,0,0);// 输出结果console.log(minDiff);rl.close();});C#includeiostream#includevector#includestring#includesstream#includeclimits#includecmath// 全局变量用于存储最小差值初始化为最大长整型longlongminDiffLLONG_MAX;longlongtotalSum0;intn;inttargetCount;// 每组需要的人数 (n/2)std::vectorlonglongnums;// 存储玩家战斗力/** * 深度优先搜索所有组合 * param index 当前考虑的玩家索引 * param count 当前已选入第一组的玩家数量 * param currentSum 当前第一组的战斗力总和 */voiddfs(intindex,intcount,longlongcurrentSum){// 剪枝条件1如果已经选够了 n/2 个人if(counttargetCount){// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 |currentSum - (totalSum - currentSum)| |2 * currentSum - totalSum|longlongdiffstd::abs(2*currentSum-totalSum);// 更新最小差值if(diffminDiff){minDiffdiff;}return;}// 剪枝条件2如果剩余的可选人数不足以凑齐 targetCount直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if((n-index)(targetCount-count)){return;}// 策略1选择当前玩家进入第一组dfs(index1,count1,currentSumnums[index]);// 策略2不选当前玩家进入第一组即归入第二组// 这里有个小优化如果 diff 已经为 0没必要继续搜了if(minDiff0){dfs(index1,count,currentSum);}}intmain(){std::string line;std::getline(std::cin,line);std::istringstreamiss(line);longlongnum;// 读取输入while(issnum){nums.push_back(num);}// 初始化数据nnums.size();targetCountn/2;for(longlongnum:nums){totalSumnum;}// 开始深度优先搜索dfs(0,0,0);// 输出结果std::coutminDiffstd::endl;return0;}Gopackagemainimport(fmtmathstringsstrconv)// 全局变量用于存储最小差值初始化为最大长整型varminDiffint64math.MaxInt64vartotalSumint64varnintvartargetCountint// 每组需要的人数 (n/2)varnums[]int64// 存储玩家战斗力/** * 深度优先搜索所有组合 * param index 当前考虑的玩家索引 * param count 当前已选入第一组的玩家数量 * param currentSum 当前第一组的战斗力总和 */funcdfs(index,countint,currentSumint64){// 剪枝条件1如果已经选够了 n/2 个人ifcounttargetCount{// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 |currentSum - (totalSum - currentSum)| |2 * currentSum - totalSum|diff:int64(math.Abs(float64(2*currentSum-totalSum)))// 更新最小差值ifdiffminDiff{minDiffdiff}return}// 剪枝条件2如果剩余的可选人数不足以凑齐 targetCount直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if(n-index)(targetCount-count){return}// 策略1选择当前玩家进入第一组dfs(index1,count1,currentSumnums[index])// 策略2不选当前玩家进入第一组即归入第二组// 这里有个小优化如果 diff 已经为 0没必要继续搜了ifminDiff0{dfs(index1,count,currentSum)}}funcmain(){varinputstringfmt.Scanln(input)// 读取输入strNums:strings.Fields(input)numsmake([]int64,len(strNums))fori,s:rangestrNums{nums[i],_strconv.ParseInt(s,10,64)totalSumnums[i]}// 初始化数据nlen(nums)targetCountn/2// 开始深度优先搜索dfs(0,0,0)// 输出结果fmt.Println(minDiff)}C语言#includestdio.h#includestdlib.h#includestring.h#includelimits.h#includemath.h// 全局变量用于存储最小差值初始化为最大长整型longlongminDiffLLONG_MAX;longlongtotalSum0;intn;inttargetCount;// 每组需要的人数 (n/2)longlong*nums;// 存储玩家战斗力/** * 深度优先搜索所有组合 * param index 当前考虑的玩家索引 * param count 当前已选入第一组的玩家数量 * param currentSum 当前第一组的战斗力总和 */voiddfs(intindex,intcount,longlongcurrentSum){// 剪枝条件1如果已经选够了 n/2 个人if(counttargetCount){// 计算两组的差值// 第一组和为 currentSum// 第二组和为 totalSum - currentSum// 差值 |currentSum - (totalSum - currentSum)| |2 * currentSum - totalSum|longlongdiffllabs(2*currentSum-totalSum);// 更新最小差值if(diffminDiff){minDiffdiff;}return;}// 剪枝条件2如果剩余的可选人数不足以凑齐 targetCount直接返回// (n - index) 是剩余可遍历的元素个数// (targetCount - count) 是还需要选的元素个数if((n-index)(targetCount-count)){return;}// 策略1选择当前玩家进入第一组dfs(index1,count1,currentSumnums[index]);// 策略2不选当前玩家进入第一组即归入第二组// 这里有个小优化如果 diff 已经为 0没必要继续搜了if(minDiff0){dfs(index1,count,currentSum);}}intmain(){charline[10000];fgets(line,sizeof(line),stdin);// 计算输入数字的个数n0;char*tokenstrtok(line, \n);while(token!NULL){n;tokenstrtok(NULL, \n);}// 分配内存nums(longlong*)malloc(n*sizeof(longlong));// 重新读取数字inti0;tokenstrtok(line, \n);while(token文章目录最新华为上机考试题目描述输入描述输出描述示例1示例2解题思路JavaPythonJavaScriptCGoC语言