重庆公积金门户网站,学电子商务好找工作吗,网站上的小动画咋做,wordpress 采集最新华为上机考试
真题目录#xff1a;点击查看目录 华为OD面试真题精选#xff1a;点击立即查看 2025华为od机试双机位B卷
题目描述
只贪吃的猴子#xff0c;来到一个果园#xff0c;发现许多串香蕉排成一行#xff0c;每串香蕉上有若干根香蕉。每串香蕉的根数由数组…最新华为上机考试真题目录点击查看目录华为OD面试真题精选点击立即查看2025华为od机试双机位B卷题目描述只贪吃的猴子来到一个果园发现许多串香蕉排成一行每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。猴子获取香蕉每次都只能从行的开头或者末尾获取并且只能获取N次求猴子最多能获取多少根香蕉。输入描述第一行为数组numbers的长度第二行为数组numbers的值每个数字通过空格分开第三行输入为N表示获取的次数备注1 ≤ numbers.length ≤ 1000001 ≤ numbers ≤ 1001 ≤ N ≤ numbers.length输出描述按照题目要求能获取的最大数值用例输入7 1 2 2 7 3 6 1 3输出10说明第一次获取香蕉无论是从行的开头或者末尾获取得到的香蕉根数目为1, 但是从行末尾获取能获取到最优的策略后面可以直接得到香蕉根数目6和3。因此最终根数为16310用例2输入3 1 2 3 3输出6说明全部获取所有的香蕉因此最终根数为1236用例3输入4 4 2 2 3 2输出7说明第一次获取香蕉为行的开头第二次获取为行的末尾因此最终根数为437题目解析要求从每次都只能从行的开头或者末尾获取我们以用例1解释题目1 2 2 7 3 6 1每次都是开头或末尾第一次开头和末尾都是1第二次如果我们第一次是开头此时数字就是【2 2 7 3 6 1】开头就是2 结尾就是1。如果我们第一次是结尾此时数字就是【1 2 2 7 3 6 】开头就是1 结尾就是6。这样我们就会发现第一次选末尾 第二次选末尾第三次仍然选末尾这样就是最多根。我们以用例3解释题目4 2 2 3我们一眼可以看出第一次选开头 第二次选末尾。从这两个例子我们好像找不到啥规律啊但是我们把视角转到选不到的桃子你会发现无论每次是选开头还是结尾选不到的桃子永远是连续的对不对 再转念一想我们把数组看成一个环选中的开头和结尾是不是也就是连续的啊。这样我们自然而然就想到了**【滑动窗口】**试验了两种解法一种的选中的是连续的一种是未选中的连续选中的就是数组-未选中的。我觉得从未选中的角度去解题比较简单。最终就转换为求某个连续的区间是的总和最小。解题思路读取输入包括数组长度、数组元素每串香蕉的数量以及猴子可以获取的次数。计算数组中所有香蕉的总数。如果猴子可以获取的次数等于数组长度即猴子可以拿走所有的香蕉直接返回总数。**计算猴子不能拿走的连续香蕉串的最小总数。**这是通过滑动窗口实现的窗口大小为数组长度 - N。初始化滑动窗口的和为窗口内的第一段连续香蕉串的和。滑动窗口每次向右移动一位更新窗口和并记录最小的窗口和。猴子能获取的最大香蕉数是总和减去最小窗口和。模拟计算过程给定输入数组长度7 香蕉数量1 2 2 7 3 6 1 猴子次数3计算香蕉总数1 2 2 7 3 6 1 22窗口大小7 - 3 4初始化窗口和1 2 2 7 12滑动窗口并计算最小窗口和窗口[2, 2, 7, 3]和为14最小和仍为12窗口[2, 7, 3, 6]和为18最小和仍为12窗口[7, 3, 6, 1]和为17最小和仍为12猴子能获取的最大香蕉数总和 - 最小窗口和 22 - 12 10因此猴子能获取的最大香蕉数为10。C#includeiostream#includevector#includeclimitsusing namespace std;// 计算猴子能获取的最大香蕉数intmaxBananas(constvectorintnumbers,intN){inttotal0;// 初始化数组总和为0// 计算数组中所有香蕉的总数for(intnumber:numbers){totalnumber;}// 如果N等于数组长度猴子可以拿走所有的香蕉if(Nnumbers.size()){returntotal;}intminWindowSumINT_MAX;// 初始化最小窗口和为最大整数值intcurrentWindowSum0;// 初始化当前窗口和为0intwindowSizenumbers.size()-N;// 计算窗口大小// 初始化窗口的和for(inti0;iwindowSize;i){currentWindowSumnumbers[i];}minWindowSumcurrentWindowSum;// 将当前窗口和赋值给最小窗口和// 通过滑动窗口计算最小窗口和for(intiwindowSize;inumbers.size();i){// 窗口滑动加上新进入窗口的元素减去离开窗口的元素currentWindowSumnumbers[i]-numbers[i-windowSize];// 更新最小窗口和minWindowSummin(minWindowSum,currentWindowSum);}// 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-minWindowSum;}intmain(){intlen;// 读取数组长度cinlen;vectorintnumbers(len);// 创建数组存储每串香蕉的数量for(inti0;ilen;i){cinnumbers[i];// 循环读取每串香蕉的数量}intN;// 读取猴子可以获取的次数cinN;coutmaxBananas(numbers,N)endl;// 输出猴子能获取的最大香蕉数return0;}Javaimportjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);intlenscanner.nextInt();// 读取数组长度int[]numbersnewint[len];// 创建数组存储每串香蕉的数量for(inti0;ilen;i){numbers[i]scanner.nextInt();// 循环读取每串香蕉的数量}intNscanner.nextInt();// 读取猴子可以获取的次数System.out.println(maxBananas(numbers,N));// 输出猴子能获取的最大香蕉数}// 定义方法计算猴子能获取的最大香蕉数privatestaticintmaxBananas(int[]numbers,intN){inttotal0;// 初始化数组总和为0// 计算数组中所有香蕉的总数for(intnumber:numbers){totalnumber;}// 如果N等于数组长度猴子可以拿走所有的香蕉if(Nnumbers.length){returntotal;}intminWindowSumInteger.MAX_VALUE;// 初始化最小窗口和为最大整数值intcurrentWindowSum0;// 初始化当前窗口和为0intwindowSizenumbers.length-N;// 计算窗口大小// 初始化窗口的和for(inti0;iwindowSize;i){currentWindowSumnumbers[i];}minWindowSumcurrentWindowSum;// 将当前窗口和赋值给最小窗口和// 通过滑动窗口计算最小窗口和for(intiwindowSize;inumbers.length;i){// 窗口滑动加上新进入窗口的元素减去离开窗口的元素currentWindowSumnumbers[i]-numbers[i-windowSize];// 更新最小窗口和minWindowSumMath.min(minWindowSum,currentWindowSum);}// 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-minWindowSum;}}javaScript// 使用Node.js的readline模块来处理输入constreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});// 读取输入rl.on(line,(len){lenparseInt(len);rl.on(line,(numbers){numbersnumbers.split( ).map(Number);rl.on(line,(N){NparseInt(N);console.log(maxBananas(numbers,N));// 输出猴子能获取的最大香蕉数rl.close();});});});// 计算猴子能获取的最大香蕉数functionmaxBananas(numbers,N){lettotalnumbers.reduce((acc,val)accval,0);// 计算数组中所有香蕉的总数if(Nnumbers.length){returntotal;// 如果N等于数组长度猴子可以拿走所有的香蕉}letminWindowSumInfinity;// 初始化最小窗口和为无穷大letcurrentWindowSum0;// 初始化当前窗口和为0letwindowSizenumbers.length-N;// 计算窗口大小for(leti0;iwindowSize;i){currentWindowSumnumbers[i];}minWindowSumcurrentWindowSum;for(letiwindowSize;inumbers.length;i){currentWindowSumnumbers[i]-numbers[i-windowSize];minWindowSumMath.min(minWindowSum,currentWindowSum);}returntotal-minWindowSum;// 猴子能获取的最大香蕉数是总和减去最小窗口和}Pythonimportsys# 计算猴子能获取的最大香蕉数的函数defmax_bananas(numbers,N):# 计算数组中所有香蕉的总数totalsum(numbers)# 如果N等于数组长度猴子可以拿走所有的香蕉ifNlen(numbers):returntotal# 初始化最小窗口和为无穷大min_window_sumfloat(inf)# 初始化当前窗口和为0current_window_sum0# 计算窗口大小window_sizelen(numbers)-N# 初始化当前窗口的和foriinrange(window_size):current_window_sumnumbers[i]min_window_sumcurrent_window_sum# 通过滑动窗口计算最小窗口和foriinrange(window_size,len(numbers)):# 窗口滑动加上新进入窗口的元素减去离开窗口的元素current_window_sumnumbers[i]-numbers[i-window_size]# 更新最小窗口和min_window_summin(min_window_sum,current_window_sum)# 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-min_window_sum# 读取数组长度array_lengthint(input())# 读取数组将输入的字符串分割并转换为整数列表numberslist(map(int,input().strip().split()))# 读取猴子可以获取的次数Nint(input())# 输出猴子能获取的最大香蕉数print(max_bananas(numbers,N))Gopackagemainimport(fmtmath)funcmain(){varlenintfmt.Scan(len)// 读取数组长度numbers:make([]int,len)// 创建数组存储每串香蕉的数量fori:0;ilen;i{fmt.Scan(numbers[i])// 循环读取每串香蕉的数量}varNintfmt.Scan(N)// 读取猴子可以获取的次数fmt.Println(maxBananas(numbers,N))// 输出猴子能获取的最大香蕉数}// 定义方法计算猴子能获取的最大香蕉数funcmaxBananas(numbers[]int,Nint)int{total:0// 初始化数组总和为0// 计算数组中所有香蕉的总数for_,number:rangenumbers{totalnumber}// 如果N等于数组长度猴子可以拿走所有的香蕉ifNlen(numbers){returntotal}minWindowSum:math.MaxInt32// 初始化最小窗口和为最大整数值currentWindowSum:0// 初始化当前窗口和为0windowSize:len(numbers)-N// 计算窗口大小// 初始化窗口的和fori:0;iwindowSize;i{currentWindowSumnumbers[i]}minWindowSumcurrentWindowSum// 将当前窗口和赋值给最小窗口和// 通过滑动窗口计算最小窗口和fori:windowSize;ilen(numbers);i{// 窗口滑动加上新进入窗口的元素减去离开窗口的元素currentWindowSumnumbers[i]-numbers[i-windowSize]// 更新最小窗口和minWindowSummin(minWindowSum,currentWindowSum)}// 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-minWindowSum}// 辅助函数返回两个整数中的较小值funcmin(a,bint)int{ifab{returna}returnb}C语言#includestdio.h#includelimits.h// 计算猴子能获取的最大香蕉数intmaxBananas(intnumbers[],intlen,intN){inttotal0;// 初始化数组总和为0// 计算数组中所有香蕉的总数for(inti0;ilen;i){totalnumbers[i];}// 如果N等于数组长度猴子可以拿走所有的香蕉if(Nlen){returntotal;}intminWindowSumINT_MAX;// 初始化最小窗口和为最大整数值intcurrentWindowSum0;// 初始化当前窗口和为0intwindowSizelen-N;// 计算窗口大小// 初始化窗口的和for(inti0;iwindowSize;i){currentWindowSumnumbers[i];}minWindowSumcurrentWindowSum;// 将当前窗口和赋值给最小窗口和// 通过滑动窗口计算最小窗口和for(intiwindowSize;ilen;i){// 窗口滑动加上新进入窗口的元素减去离开窗口的元素currentWindowSumnumbers[i]-numbers[i-windowSize];// 更新最小窗口和if(currentWindowSumminWindowSum){minWindowSumcurrentWindowSum;}}// 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-minWindowSum;}intmain(){intlen;// 读取数组长度scanf(%d,len);intnumbers[len];// 创建数组存储每串香蕉的数量for(inti0;ilen;i){scanf(%d,numbers[i]);// 循环读取每串香蕉的数量}intN;// 读取猴子可以获取的次数scanf(%d,N);printf(%d\n,maxBananas(numbers,len,N));// 输出猴子能获取的最大香蕉数return0;}完整用例用例15 2 4 5 1 3 2用例26 1 3 2 5 4 2 3用例34 5 1 2 3 2用例48 3 2 7 1 2 6 4 5 4用例510 1 2 3 4 5 6 7 8 9 10 5用例67 10 20 30 40 50 60 70 3用例73 3 2 1 2用例89 1 3 5 7 9 11 13 15 17 5用例96 6 7 8 1 2 3 4用例105 4 1 2 3 4 3文章目录最新华为上机考试题目描述输入描述输出描述用例用例2用例3题目解析我们以用例1解释题目我们以用例3解释题目解题思路模拟计算过程CJavajavaScriptPythonGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10