8.19华为OD机试真题 新系统 - 基站低能耗时段统计 (Java/Py/C/C++/Js/Go)
基站低能耗时段统计2026 华为OD机试真题8月19日华为OD上机新系统考试真题 100 分题型点击查看华为 OD 机试真题完整目录2026最新华为OD机试新系统卷 双机位C卷 真题题库目录全覆盖题库 逐点算法考点详解题目描述基站运维团队需要统计某区域基站的低能耗连续运行时段数目以评估基站的节能优化效果。给定以下信息整数数组powerpower[i]表示该基站第 i 小时的能耗值单位千瓦时power[i] 0能耗不会为负整数target低能耗阈值单位千瓦时要求连续时段的总能耗不超过该阈值整数max_hour最大统计时长单位小时要求连续时段的时长不超过该值且至少为 1 小时。请你统计满足以下两个条件的连续运行时段子数组的数目连续时段的时长属于[1,max_hour]该时段内的总能耗 target。补充说明1 power.length 10^50 power[i] 1000 target 10^71 max_hour power.length所有能耗值非负输入描述输入包含两行第一行整数数组power的表示形式如[0,0,0]第二行两个整数target和max_hour以逗号分隔如0,2。输出描述输出一个整数表示满足条件的连续运行时段数目。示例1输入[0,0,0] 0,2输出5说明长度 1 子数组下标 0、1、2 处共 3 个长度 2 子数组下标区间[0,1]、[1,2]共 2 个总计325 个。示例2输入[3,1,2,4,1] 5,3输出8说明长度 1 子数组每个单元素能耗均不超过 5共 5 个长度 2 子数组满足条件的有 3 个长度 3 子数组满足条件的有 0 个总计8 个。示例3输入[5,4,3] 6,2输出3说明长度 1 子数组能耗分别为 5、4、3均 6共 3 个长度 2 子数组满足条件的有 0 个总计3 个。解题思路核心思想由于所有能耗值都是非负数当右端点向右移动时窗口总和不会减少。因此可以使用滑动窗口。枚举左端点left维护最远右端点right使窗口[left,right]同时满足窗口长度不超过max_hour窗口总和不超过target那么以left为起点的合法连续时段数量就是right-left1。算法步骤初始化right-1、sum0、答案ans0。枚举左端点left。在长度和总能耗都满足限制时不断右移right。若rightleft则将right-left1累加到答案。左端点右移前从窗口总和中减去power[left]。枚举结束后输出答案。复杂度分析时间复杂度O(n)左右指针都最多移动n次。空间复杂度O(1)除输入数组外只使用常数额外空间。Javaimportjava.util.*;publicclassMain{publicstaticlongsolve(int[]power,inttarget,intmaxHour){intnpower.length;longanswer0;intright-1;longsum0;for(intleft0;leftn;left){if(rightleft){rightleft-1;sum0;}while(right1nright1-left1maxHoursumpower[right1]target){// 向右扩展窗口保持长度和总能耗都合法right;sumpower[right];}if(rightleft){// 固定左端点时所有不超过 right 的右端点都合法answerright-left1;sum-power[left];}}returnanswer;}privatestaticint[]parseArray(Stringline){lineline.trim();lineline.substring(1,line.length()-1);if(line.isEmpty())returnnewint[0];String[]partsline.split(,);int[]arrnewint[parts.length];for(inti0;iparts.length;i){arr[i]Integer.parseInt(parts[i].trim());}returnarr;}publicstaticvoidmain(String[]args){ScannerscannernewScanner(System.in);int[]powerparseArray(scanner.nextLine());String[]partsscanner.nextLine().trim().split(,);inttargetInteger.parseInt(parts[0].trim());intmaxHourInteger.parseInt(parts[1].trim());System.out.println(solve(power,target,maxHour));}}Pythonimportastdefsolve(power,target,max_hour):nlen(power)ans0right-1current_sum0forleftinrange(n):ifrightleft:rightleft-1current_sum0whileright1nandright1-left1max_hourandcurrent_sumpower[right1]target:# 右端点尽量扩展到仍然合法的位置right1current_sumpower[right]ifrightleft:# 以 left 为左端点的合法子数组共有 right-left1 个ansright-left1current_sum-power[left]returnans powerast.literal_eval(input().strip())target,max_hourmap(int,input().strip().split(,))print(solve(power,target,max_hour))JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});constlines[];rl.on(line,linelines.push(line.trim()));rl.on(close,(){constpowerJSON.parse(lines[0]);const[target,maxHour]lines[1].split(,).map(Number);console.log(String(solve(power,target,maxHour)));});functionsolve(power,target,maxHour){constnpower.length;letanswer0n;letright-1;letsum0;for(letleft0;leftn;left){if(rightleft){rightleft-1;sum0;}while(right1nright1-left1maxHoursumpower[right1]target){// 向右扩展窗口直到长度或总能耗不再满足要求right;sumpower[right];}if(rightleft){// 固定左端点时合法右端点数量为 right-left1answerBigInt(right-left1);sum-power[left];}}returnanswer;}C#includebits/stdc.husingnamespacestd;longlongsolve(constvectorintpower,inttarget,intmaxHour){intnpower.size();longlonganswer0;intright-1;longlongsum0;for(intleft0;leftn;left){if(rightleft){rightleft-1;sum0;}while(right1nright1-left1maxHoursumpower[right1]target){// 在满足长度和能耗限制的前提下扩展右端点right;sumpower[right];}if(rightleft){// 当前左端点对应的合法子数组数量answerright-left1;sum-power[left];}}returnanswer;}vectorintparseArray(string line){vectorintarr;lineline.substr(1,line.size()-2);if(line.empty())returnarr;string item;stringstreamss(line);while(getline(ss,item,,)){arr.push_back(stoi(item));}returnarr;}intmain(){string line1,line2;getline(cin,line1);getline(cin,line2);vectorintpowerparseArray(line1);stringstreamss(line2);string a,b;getline(ss,a,,);getline(ss,b,,);coutsolve(power,stoi(a),stoi(b))endl;return0;}Gopackagemainimport(bufioencoding/jsonfmtosstrconvstrings)funcsolve(power[]int,targetint,maxHourint)int64{n:len(power)varanswerint640right:-1sum:0forleft:0;leftn;left{ifrightleft{rightleft-1sum0}forright1nright1-left1maxHoursumpower[right1]target{// 右指针尽量向后移动保持窗口合法rightsumpower[right]}ifrightleft{// 以当前 left 开头的合法连续时段数量answerint64(right-left1)sum-power[left]}}returnanswer}funcmain(){reader:bufio.NewReader(os.Stdin)line1,_:reader.ReadString(\n)line2,_:reader.ReadString(\n)varpower[]intjson.Unmarshal([]byte(strings.TrimSpace(line1)),power)parts:strings.Split(strings.TrimSpace(line2),,)target,_:strconv.Atoi(strings.TrimSpace(parts[0]))maxHour,_:strconv.Atoi(strings.TrimSpace(parts[1]))fmt.Println(solve(power,target,maxHour))}C语言#includestdio.h#includestdlib.h#includestring.h#includectype.hlonglongsolve(intpower[],intn,inttarget,intmaxHour){longlonganswer0;intright-1;longlongsum0;for(intleft0;leftn;left){if(rightleft){rightleft-1;sum0;}while(right1nright1-left1maxHoursumpower[right1]target){// 扩展右端点保证窗口长度和总能耗都合法right;sumpower[right];}if(rightleft){// 固定左端点时合法子数组数量为 right-left1answerright-left1;sum-power[left];}}returnanswer;}intparseArray(char*line,intarr[]){intn0;char*pline;while(*p*p![)p;if(*p[)p;while(*p*p!]){while(*p(*p,||isspace((unsignedchar)*p)))p;if(!isdigit((unsignedchar)*p))break;intnum0;while(*pisdigit((unsignedchar)*p)){numnum*10(*p-0);p;}arr[n]num;}returnn;}intmain(){charline1[200000];charline2[64];intpower[100000];inttarget,maxHour;fgets(line1,sizeof(line1),stdin);fgets(line2,sizeof(line2),stdin);intnparseArray(line1,power);sscanf(line2,%d,%d,target,maxHour);printf(%lld\n,solve(power,n,target,maxHour));return0;}完整用例用例1[0,0,0] 0,2用例2[3,1,2,4,1] 5,3用例3[5,4,3] 6,2用例4[1,2,3,4] 100,2用例5[10,10,10] 5,2用例6[1,1,1,1] 2,3用例7[2,0,2,0] 2,4用例8[0,5,0,5,0] 5,2用例9[3,1,1,1,3] 4,5用例10[100,100,100,100,100] 100,3文章目录基站低能耗时段统计题目描述输入描述输出描述示例1示例2示例3解题思路核心思想算法步骤复杂度分析JavaPythonJavaScriptCGoC语言完整用例用例1用例2用例3用例4用例5用例6用例7用例8用例9用例10