news 2026/4/16 14:47:32

华为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/4/16 7:25:40

第 6 课:Vue 3 工程化与项目部署实战 —— 从本地开发到线上发布

在前 5 课中&#xff0c;我们已经完成了前后端交互&#xff08;Axios&#xff09;和企业级界面搭建&#xff08;Element Plus&#xff09;&#xff0c;得到了一个功能完整、界面美观的待办应用。但此时应用仍停留在本地开发环境&#xff0c;无法被他人访问。本节课将聚焦 工程化…

作者头像 李华
网站建设 2026/4/16 7:29:26

海外短剧APP开发:引领跨文化娱乐新风尚,打造沉浸式观赏新体验

一、项目背景与市场机遇在全球化数字娱乐浪潮下&#xff0c;短剧以其“短、平、快”的特点迅速占领用户碎片化时间。海外市场对高质量、多样化短剧内容需求激增&#xff0c;跨文化娱乐消费成为新趋势。本APP旨在打造一个连接全球短剧创作者与观众的创新平台&#xff0c;让文化穿…

作者头像 李华
网站建设 2026/4/16 7:27:46

Mybatis-万能的Map模糊查询

Map写法 假设&#xff0c;我们的实体类&#xff0c;或者数据库中的表&#xff0c;字段或者参数过多&#xff0c;我们应当考虑使用Map Maaapper.xml 配置文件中<!--万能的map--><insert id"addUser2" parameterType"map">insert into mybatis.u…

作者头像 李华
网站建设 2026/4/16 7:27:45

医疗模型部署兼容差,补ONNX转换才稳住跨平台推理

&#x1f4dd; 博客主页&#xff1a;jaxzheng的CSDN主页 目录 我和医疗数据科学的相爱相杀 当AI遇见病历 数据孤岛生存指南 隐私保护的奇幻漂流 未来已来&#xff08;可能还没来&#xff09; 写在最后 我和医疗数据科学的相爱相杀 &#xff08;此处应有爆炸头表情包&#xff0…

作者头像 李华
网站建设 2026/4/16 7:29:28

43、深入探索文件属性与图像操作

深入探索文件属性与图像操作 在处理文件时,我们常常需要获取文件的缩略图、通用属性、特定媒体属性等信息,同时也会涉及对图像进行更复杂的操作,如转换为灰度图等。下面将详细介绍这些内容。 文件缩略图获取 StorageFile.getThumbnailAsync 方法可以根据 Windows.Stora…

作者头像 李华