通过率 0% · 提交 0 · 通过 0
这道 OJ 的配套动画
二分答案与可行性判定 · 对应本题的思路、过程和代码
数据管线要把 n 条样本按原顺序切成恰好 k 个连续且非空的分片,每个分片交给一个 worker 串行处理。第 i 条样本的预处理耗时为 t_i,一个 worker 的总耗时是它分片内耗时之和,整条管线的完成时间取决于耗时最大的那个 worker。请输出通过合理切分能达到的最小完成时间。
这类题属于算法机考高频题型中「华为 AI 岗 / 二分答案」方向的高频题型,通常考察对「华为 AI 岗 / 二分答案」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
第一行输入两个整数 n k。第二行输入 n 个整数 t_i。
输出一行一个整数,表示最小化的最大分片耗时之和。
1 <= k <= n <= 2000;0 <= t_i <= 1000000。
示例 1
输入示例
5 2 7 2 5 10 8
输出示例
18
经典切分
示例 2
输入示例
4 1 5 9 1 7
输出示例
22
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
训练营动画视频讲解
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
只切一片=总和
时间限制 2000 ms · 内存限制 256 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有
这些是真正决定能不能 AC、但通用题解里常被略过的点。
答案是最大单段耗时的最小可能值。它至少为 max(t),至多为 sum(t)。对候选上限 x,从左到右贪心装入当前段;若加入下一项会超过 x,就从该项开始新段。这样得到在上限 x 下所需的最少段数。若最少段数不超过 k,则可以继续细分成恰好 k 个非空连续段,因此 x 可行。利用可行性的单调性二分最小可行值。
贪心始终把当前段延伸到不能再加入下一项为止,所以每一段都不早于任何其他合法方案结束,得到的段数最少。候选上限增大时最少段数不会增加,可行区间具有单调性。二分结束时得到的就是最小可行上限。
每次判定扫描 n 个元素,二分范围为 [max(t),sum(t)],时间复杂度为 O(n log(sum(t)-max(t)+1)),额外空间为 O(1)。
下界必须是最大单项,判定条件是段数 ≤k 而不是必须等于 k。k=1 时答案为总和,k=n 时答案为最大单项;求和和二分中间值使用 64 位整数。
# 二分答案:对「最大段和上限 x」二分,贪心判定最少段数是否 <= k
# 下界是 max(t)(单条不可再切),上界是总和;段数可细分所以判定用 <=
import sys
def solve() -> None:
data = sys.stdin.buffer.read().split()
if not data:
return
n = int(data[0])
k = int(data[1])
t = [int(x) for x in data[2:2 + n]]
def feasible(cap: int) -> bool:
seg = 1
cur = 0
for x in t:
if x > cap:
return False
if cur + x > cap:
seg += 1
cur = x
else:
cur += x
return seg <= k
lo = max(t)
hi = sum(t)
while lo < hi:
mid = (lo + hi) // 2
if feasible(mid):
hi = mid
else:
lo = mid + 1
print(lo)
if __name__ == "__main__":
solve()