本题要求把长度为 L 的序列 w 划成恰好 k 段连续非空子段,使各段元素和的最大值(峰值负载 peak)最小。这是经典的 二分答案 + 贪心验证(与 LeetCode 410「分割数组的最大值」同型)。
can(limit):从左到右贪心累加当前段和,超过 limit 就新开一段;统计最少段数 cnt。若 cnt≤k,说明可在不超过 limit 的前提下拆成至多 k 段;因 k≤L 且每段非空,还可继续切到恰好 k 段而不增大峰值。在大模型训练中,常使用流水线并行(Pipeline Parallelism)将模型的不同层划分到多个计算节点上执行。为避免某个节点负载过高导致系统整体变慢,需要合理划分模型层。
假设一个模型共有 L 层,第 i 层的计算量为 wi(0≤i≤L−1)。现需将这些层划分到 k 个计算节点上,使得整个系统的峰值负载最小。
设某计算节点分到连续层 wl,wl+1,…,wr,则该节点段负载为
s=wl+wl+1+⋯+wr系统峰值负载为所有节点段负载的最大值:
peak=max(s1,s2,…,sk)求一种合法划分,使 peak 最小,并输出该最小值。
第一行:整型 L,表示模型层数。
第二行:L 个整型 w0,w1,…,wL−1,表示各层计算量。
第三行:整型 k,表示计算节点数量。
数据范围:
输出一个整型,表示最小的系统峰值负载 peak。
输入
5
3 1 4 1 5
2
输出
8
说明
模型共 L=5 层,需划到 k=2 个节点。最优划分为 [3,1,4] 与 [1,5],两段负载分别为 8 与 6,峰值为 8。
输入
4
10 20 30 40
2
输出
60
说明
最优划分为 [10,20,30] 与 [40],两段负载分别为 60 与 40,峰值为 60。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.