news 2026/2/3 5:02:08

华为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/2/1 13:30:39

聚合跑腿+主动推单:构建本地即时服务流量闭环,提升平台竞争力

一、本地跑腿平台困境&#xff1a;流量获取难、用户粘性低、订单不稳定 本地跑腿市场需求旺盛&#xff0c;但多数平台陷入流量困境&#xff0c;难以持续发展&#xff1a; 获客成本高&#xff1a;依赖广告、地推&#xff0c;单用户获客成本高且转化差用户粘性低&#xff1a;多为…

作者头像 李华
网站建设 2026/2/3 9:09:15

39、SharePoint开发:部署配置、冲突解决与环境准备

SharePoint开发:部署配置、冲突解决与环境准备 1. 验证新部署配置 要验证新的部署配置,可将其设置为活动配置并部署项目。其行为与默认配置相同,但在自定义配置中,还会将 .WSP 文件复制到代码中指定的位置。 2. 部署冲突 在开发过程中,通常会反复将同一项目部署到 Sha…

作者头像 李华
网站建设 2026/2/3 5:08:43

45、Windows 媒体捕获与流处理技术详解

Windows 媒体捕获与流处理技术详解 在当今数字化的时代,多媒体应用无处不在,无论是拍照、录像,还是流媒体播放,都离不开强大的媒体处理技术。本文将深入探讨 Windows 平台下的媒体捕获与流处理相关技术,包括相机捕获设置、MediaCapture 对象的灵活应用、流媒体传输以及数…

作者头像 李华
网站建设 2026/2/1 23:56:19

46、媒体操作与目的动画全解析

媒体操作与目的动画全解析 1. 媒体操作基础 在媒体操作方面,有一段关键代码用于处理媒体流: } else { var blob = MSApp.createBlobFromRandomAccessStream(eventIn.stream.contentType, eventIn.stream); id("dmrVideo").src = URL.createObjectURL(blob, {on…

作者头像 李华
网站建设 2026/1/29 16:16:02

9、Windows Server 2008 安装与配置全解析

Windows Server 2008 安装与配置全解析 1. 安装方式概述 在网络环境下进行 Windows Server 2008 的安装,有手动和远程两种主要方式。 手动网络安装时,与前文所述流程差异不大,但需要将本地驱动器号映射到网络共享文件夹,此映射的驱动器号会告知安装程序分发文件的位置,…

作者头像 李华
网站建设 2026/1/31 12:40:16

备课时间减半,教学效果翻倍:大角几何如何改变我的数学课堂

一位一线教师的真实体验分享 作为一名有十年教龄的初中数学教师&#xff0c;我经历过备课的种种艰辛。曾经&#xff0c;为了准备一堂几何公开课&#xff0c;我需要花费数小时在复杂的作图软件中挣扎&#xff0c;调试动画效果、调整图形参数、确保标注精准……这些技术性问题常…

作者头像 李华