news 2026/4/23 19:14:50

华为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/23 18:53:58

FF corner的芯片为什么IDD会更大?

在芯片的生产过程中我们经常会遇到某片wafer由于“跑的偏快了”&#xff0c;导致整体IDD偏大&#xff0c;从而引起low yield。那么为什么“跑快了”会导致IDD变大呢&#xff1f;首先我们来看一下corner概念&#xff1a;芯片制造是一个物理过程&#xff0c;存在着工艺偏差&#…

作者头像 李华
网站建设 2026/4/23 17:44:04

商超到家即时服务:软件基础功能打通“线上线下”关键链路

商超到家是即时配送核心赛道&#xff0c;消费者线上下单、30分钟收货的需求持续攀升。但商超运营难题突出&#xff1a;商品种类多管理难、高峰备货配送跟不上、对账复杂易出错。软件基础功能若能打通全链路&#xff0c;就能轻松破解这些痛点。 一、商超场景核心基础功能适配 1.…

作者头像 李华
网站建设 2026/4/23 11:30:55

CE65H270TOEI能华650V耐压耗尽型140W氮化镓快充方案,高转换效率

2025 年&#xff0c;快充赛道进入“后硅时代”。当 100 W 以上多口充电器纷纷把体积压到饼干盒大小&#xff0c;消费者开始追问&#xff1a;下一波红利到底靠什么&#xff1f;能华&#xff08;CorEnergy&#xff09;用一颗 650 V 耗尽型氮化镓晶体管 CE65H270TOEI 给出答案——…

作者头像 李华
网站建设 2026/4/23 11:48:43

AI便民就医系统:用技术重构就医全流程

看病挂号排长队、挂错科室白跑腿、病历繁杂难整理——这些就医痛点&#xff0c;曾是很多人的困扰。AI便民就医服务管理系统&#xff0c;正是用技术打破医疗服务壁垒&#xff0c;把“麻烦事”变“顺心事”&#xff0c;让智能赋能诊疗每一环&#xff0c;既省心又高效。 诊前环节&…

作者头像 李华
网站建设 2026/4/23 11:52:58

揭秘!提示工程架构师年薪百万的5大核心技能

揭秘&#xff01;提示工程架构师年薪百万的5大核心技能 标题选项 《年薪百万的提示工程架构师&#xff1a;5大核心技能全解析》《从“提示词写手”到“架构师”&#xff1a;百万年薪的关键跳跃》《提示工程架构师为什么能拿高薪&#xff1f;这5个技能是底层逻辑》《揭秘AI时代的…

作者头像 李华
网站建设 2026/4/23 11:27:48

20、Windows 客户端与服务器的域和工作组配置及策略管理

Windows 客户端与服务器的域和工作组配置及策略管理 1. 添加和配置不同客户端 1.1 添加和配置 Vista 客户端 虽然可以使用 Active Directory Users and Computers 插件向 Active Directory 添加计算机账户,但还需配置运行 Windows Vista 等操作系统的客户端计算机,使其在用…

作者头像 李华