华为 · 二分 · 算法编程题
华为 二分 n ≤ 1e3 时限 1 秒 / 256 MB

题目描述

小红正在为一批大模型推理任务配置计算服务器。共有 n 个任务,第 i 个任务需要完成 a_i 单位计算量,所有任务必须在 h 个小时内结束。
小红会同时启用 k 台服务器。每台服务器每小时能够完成 1 单位计算量,但同一个小时内,所有服务器只能共同处理同一个尚未完成的任务。如果该任务剩余的计算量小于 k ,多余的服务器会在这一小时闲置,任务仍要占用完整的一个小时。
请计算至少需要同时启用多少台服务器,才能在 h 个小时内完成所有任务。如果无论启用多少台服务器都无法按时完成,请输出 -1 。

输入输出

输入描述
第一行输入一个整数 n 。
第二行输入 n 个整数 a_1,a_2,...,a_n 。
第三行输入一个整数 h 。
保证 1 ≤ n ≤ 1000 , 1 ≤ a_i ≤ 1000007 , 1 ≤ h ≤ 1000007 。
输出描述
输出一个整数,表示满足要求的最少服务器数量;如果不存在可行配置,则输出 -1 。

样例共 1 组

样例 1 · 启用 4 台服务器时,三个任务分别需要 2 、 3 、 3 小时,总计恰好为 8 小时。
输入
3
5 9 10
8
输出
4

算法解析依据充分

考点:二分

数据规模 n ≤ 1e3 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 1e3
  • 元素值域:a_i ≤ 1000007,h ≤ 1000007(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许 O(n²);若 n ≤ 300,O(n³) 通常也跑得动,需看具体常数。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:二分

本题切入点

二分服务器数 k:给定 k 时每个任务需 ceil(a_i/k) 小时(同一小时内所有服务器只能服务同一任务),总耗时 Σceil(a_i/k) ≤ h 即可行;取下界,h 太小则 −1。

把「求最优值」转化为「判定某值是否可行」,用单调性二分逼近答案。

思路框架(二分 通法 · 非本题专属)

  1. 确认单调性:答案越大/越小,条件越容易(或越难)满足。
  2. 写出 check(x):判断值为 x 时是否可行。
  3. 在答案区间 [lo, hi] 上二分,每次取 mid 调 check,收缩区间。
  4. 边界收敛到唯一答案,注意取整方向(求最小可行值用上取整)。

实现要点:模板:while (lo < hi) { mid = (lo+hi)/2; if (check(mid)) hi = mid; else lo = mid+1; } 求最小可行值。

复杂度:时间 O(check 的代价 × log(答案范围)) | 空间 O(1)

该范式的通法易错点

  • check 函数不满足单调性却硬套二分(会得到错误答案)。
  • 二分边界或取整方向写错,陷入死循环或漏掉边界答案。

对照本题

  • 数据规模 n ≤ 1e3,允许 O(n²);若 n ≤ 300,O(n³) 通常也跑得动,需看具体常数。
  • 元素值域最大到 1000007 —— 求和 / 相乘时记得开 64 位整数。

样例解读

样例 1:输入 3 / 5 9 10 / 8 → 输出 4

启用 4 台服务器时,三个任务分别需要 2 、 3 、 3 小时,总计恰好为 8 小时。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2026年-华为-05月20号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解