news 2026/4/2 5:17:11

华为OD机考双机位C卷 - 最佳升级时间窗 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机考双机位C卷 - 最佳升级时间窗 (C++ Python JAVA JS GO)

最佳升级时间窗

2025华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型

华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解

题目描述

有一套系统需升级,为减小系统升级期间的影响,需根据系统过去一段时间内的每小时平均访问数据,来预测最佳升级时间窗。

现给长度为168(7*24)的整数数组,表示一个周期(假设从周一00:00到周日24:00)的每小时历史数据,最佳升级时间窗选择规则如下:

1:时间窗内累计用户访问量必须小于等于给定的容忍值。

2:时间窗必须是连续的x个小时,最大的x即为最佳升级时间窗,且不超过7*24.

3:时间窗允许跨周期,例如当前周期的第167小时到下一周期的第166小时,是一个长度为168的时间窗。

请计算最佳升级时间窗,并返回其开始时间和结束时间的数组下标。如果存在多个最佳升级时间窗,返回开始时间下标最小的一个。

输入描述

第一行为整数n,表示给定的升级影响的容忍值,取值范围:[0, 2^31]。

第二行为7 * 24个整数,表示一个周期(7*24)的每个小时用户访问量,每个值的范围:[0, 2^31]。

输出描述

两个整数,分别表示所计算出的最佳升级时间窗的开始时间下标(包含)和结束时间下标(包含),不存在时返回 -1 -1 。

用例1

输入

6 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 12 11 10 9 8 7 6 5 4 3 2 1

输出

22 25

说明

最佳升级窗口为:2 1 1 2

题解

思路:滑动窗口

  1. 这类题就是典型使用滑动窗口解决的题
  2. 然后思考怎么解决题目提到的时间窗允许跨周期的问题,对于这类首尾可以连接的问题,可以将数组进行扩容168*2将数组重复一次,跨周期的窗口就可以变为普通连续子数组问题。
  3. 接下来就是正常滑动窗口处理逻辑,定义左边界left = 0, right =0, 窗口和windowsSum =0maxLen= 0, resLeft = -1, resRight = -1, 接下来就是循环移动右边界,每次执行以下操作
    • windowsSum += seq[i]
    • 如果windowsSum > n,不断收缩左边界直到windowSum <=n结束,收缩边界每次执行windowsSum -= seq[left], left++
    • 经过上面就会得到一个合法的窗口,计算长度为len = right - left + 1, 然后根据与maxLen更新结果即可。这里有个易错点:之前将原数组扩容了,可能存在n > sum(originalSeq)这样长度可以超过168所以当len == 168可以直接退出滑动窗口逻辑。
    • 优化点:如果当left >= 168也可以提前退出滑动窗口逻辑,因为这里又进入了第一个周期一样的逻辑,没必要重复找。当前不做这个优化这道题也不会超时。
  4. 执行3的逻辑之后,此时根据maxLen的值输出结果
    • maxLen = 0: 说明不存在这样窗口直接输出-1 -1
    • maxLen !=0: 说明存在窗口,此时需要输出(resLeft % 168) (resRight % 168),%128主要是处于跨周期的情况要保证输出的为[0,167]范围。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; int main() { long n; cin >> n; // 由于可以首尾相连,直接将数组重复一次,这样跨周期的窗口就可以变为普通连续子数组问题 vector<long> seq(168 * 2); for (int i = 0; i < 168; i++) { cin >> seq[i]; seq[i + 168] = seq[i]; } int maxLen = 0; int resLeft = -1, resRight = -1; long windowSum = 0; int left = 0; for (int right = 0; right < 168 * 2; right++) { windowSum += seq[right]; // 保证窗口和不超过容忍值 while (windowSum > n) { windowSum -= seq[left]; left++; } // 和第一个周期重复了 if (left >= 168) { break; } int len = right - left + 1; if (len > maxLen) { maxLen = len; resLeft = left; resRight = right; } // 已经达到最大周期,可以直接退出 if (len == 168) { break; } } if (maxLen == 0) { cout << "-1 -1"; }else { cout << resLeft % 168 << " " << resRight % 168; } return 0; }

JAVA

import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long n = sc.nextLong(); // 由于可以首尾相连,直接将数组重复一次,这样跨周期的窗口就可以变为普通连续子数组问题 long[] seq = new long[168 * 2]; for (int i = 0; i < 168; i++) { seq[i] = sc.nextLong(); seq[i + 168] = seq[i]; } int maxLen = 0; int resLeft = -1, resRight = -1; long windowSum = 0; int left = 0; for (int right = 0; right < 168 * 2; right++) { windowSum += seq[right]; // 保证窗口和不超过容忍值 while (windowSum > n) { windowSum -= seq[left]; left++; } // 和第一个周期重复了 if (left >= 168) { break; } int len = right - left + 1; if (len > maxLen) { maxLen = len; resLeft = left; resRight = right; } // 已经达到最大周期,可以直接退出 if (len == 168) { break; } } if (maxLen == 0) { System.out.println("-1 -1"); } else { System.out.println(resLeft % 168 + " " + resRight % 168); } } }

Python

n=int(input())arr=list(map(int,input().split()))# 由于可以首尾相连,重复一次seq=arr+arr maxLen=0resLeft=-1resRight=-1windowSum=0left=0forrightinrange(len(seq)):windowSum+=seq[right]# 保证窗口和不超过容忍值whilewindowSum>n:windowSum-=seq[left]left+=1# 和第一个周期重复了ifleft>=168:breaklength=right-left+1iflength>maxLen:maxLen=length resLeft=left resRight=right# 已经达到最大周期,可以直接退出iflength==168:breakifmaxLen==0:print("-1 -1")else:print(resLeft%168,resRight%168)

JavaScript

letinput=[];require('readline').createInterface({input:process.stdin,output:process.stdout}).on('line',line=>input.push(line)).on('close',()=>{letn=parseInt(input[0]);letarr=input[1].split(' ').map(Number);// 由于可以首尾相连,重复一次letseq=arr.concat(arr);letmaxLen=0;letresLeft=-1,resRight=-1;letwindowSum=0;letleft=0;for(letright=0;right<seq.length;right++){windowSum+=seq[right];// 保证窗口和不超过容忍值while(windowSum>n){windowSum-=seq[left];left++;}// 和第一个周期重复了if(left>=168)break;letlen=right-left+1;if(len>maxLen){maxLen=len;resLeft=left;resRight=right;}// 已经达到最大周期,可以直接退出if(len==168)break;}if(maxLen==0){console.log("-1 -1");}else{console.log(resLeft%168,resRight%168);}});

Go

packagemainimport("fmt")funcmain(){varnint64fmt.Scan(&n)seq:=make([]int64,168*2)fori:=0;i<168;i++{fmt.Scan(&seq[i])seq[i+168]=seq[i]// 重复一次}maxLen:=0resLeft,resRight:=-1,-1varwindowSumint64=0left:=0forright:=0;right<168*2;right++{windowSum+=seq[right]// 保证窗口和不超过容忍值forwindowSum>n{windowSum-=seq[left]left++}// 和第一个周期重复了ifleft>=168{break}length:=right-left+1iflength>maxLen{maxLen=length resLeft=left resRight=right}// 已经达到最大周期,可以直接退出iflength==168{break}}ifmaxLen==0{fmt.Println("-1 -1")}else{fmt.Println(resLeft%168,resRight%168)}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/24 3:54:58

基于脱敏算法的综合医疗信息管理系统的设计与实现开题报告

2025届本科生毕业论文&#xff08;设计、创作&#xff09;开题报告论文&#xff08;设计、创作&#xff09;题目基于所在学院、专 业学生姓名学 号本课题研究意义随着信息技术的飞速发展和医疗改革的不断深入&#xff0c;医院管理面临着前所未有的挑战与机遇。传统的医院管理…

作者头像 李华
网站建设 2026/3/28 18:17:44

研究生必备:论文公式格式要求全攻略(附规范示例)

如果你是正在熬夜赶Deadline的毕业生… 凌晨两点的实验室灯光依旧刺眼&#xff0c;你盯着屏幕上密密麻麻的公式&#xff0c;一边被导师催促“尽快定稿”&#xff0c;一边担心知网查重的高昂费用会让本就紧张的生活雪上加霜——这种焦虑&#xff0c;几乎每个面临毕业的研究生都…

作者头像 李华
网站建设 2026/3/31 11:05:26

AI写论文包过工具!5款AI论文生成工具,一键生成初

写学术论文时&#xff0c;总被各种问题困扰&#xff1a;论文构思没思路&#xff0c;论文资料收集耗时长&#xff0c;搭建论文框架怕逻辑不连贯&#xff0c;写完论文还要反复调论文格式、应对论文查重&#xff0c;整套流程又费精力、效率还低。其实不用这么麻烦&#xff0c;选对…

作者头像 李华
网站建设 2026/3/30 10:39:17

FT8433 低成本5V80mA非隔离BCUK方案直接替代KP311ALGA

在小家电和智能家居领域&#xff0c;5V/80mA 的辅助电源需求无处不在&#xff0c;而 KP311ALGA 作为一款经典的非隔离 Buck 方案&#xff0c;虽然性能可靠&#xff0c;但随着市场对成本、效率和体积的更高要求&#xff0c;其局限性逐渐显现。面对高功耗、大体积以及漫长的交期&…

作者头像 李华
网站建设 2026/3/31 7:17:55

解构“句乐部”:一个现代化英语学习Web应用的技术实现猜想

从产品界面看端倪——如何用技术手段构建沉浸式、游戏化的语言学习体验&#xff1f; 前言 在当今的在线教育市场&#xff0c;单纯的内容堆砌已不再是核心竞争力。“句乐部 (Julebu)”作为一个新兴的英语学习产品&#xff0c;给我最大的印象是它极其克制的交互设计和深度的游戏…

作者头像 李华