解题思路
所有 Si>0,合法连续段越长,不折损时的重要度之和只会更大。因此第一问是经典滑动窗口:右端点右移,当占用和超过 B 时左端点右移,维护窗口内重要度之和的最大值。
第二问允许对窗口内最不重要的一块折损:占用减少 Mk−⌊Mk/2⌋,重要度少 Sk。折损代价
cost(L,R)=i=L∑RMi−(Mk−⌊Mk/2⌋)
随右端点增大而增大、随左端点增大而减小,仍可用双指针。重要度相同取占用最大的一块折损,用堆或有序集合维护 (minS,maxM)。
题目内容
端侧计算平台运行大模型时,需要在有限内存下做高性能推理,因此要对模型层做动态剪枝(Pruning)和量化(Quantization)。一层网络含 N 个参数块,块 i 有两个属性:
- 重要度评分 Si:该块对模型精度的贡献,分值越高越重要。
- 内存占用 Mi:该块量化后的存储开销。
系统负载会动态变化。必须在总内存预算 B 的约束下,选出一段连续的参数块加以保留(连续是为了保证访存局部性),使得保留段的重要度之和最大。
给定 N 个参数块的属性以及当前内存预算 B,计算:
- 在连续块总内存满足 ∑M≤B 的前提下,能够得到的最大重要度之和。
- 引入「位宽折损」:允许对当前选中连续段中最不重要的一个参数块做深度量化,其内存占用变为 ⌊Mi/2⌋,重要度变为 0。若有多块重要度同为最小,则对其中内存占用最大的一块折损。此种机制下,最大重要度之和是多少?
输入描述
第一行两个正整数 N 和 B,分别表示参数块数量与内存预算。
第二行 N 个正整数,依次为各块重要度 S1,S2,…,SN。
第三行 N 个正整数,依次为各块内存占用 M1,M2,…,MN。
数据范围:
1≤N≤105
1≤B≤109
1≤Si≤104,1≤Mi≤104
输出描述
输出一行两个整数,以空格分隔:
第一个整数:常规连续剪枝下的最大重要度之和。
第二个整数:引入「位宽折损」后的最大重要度之和。
若没有任何合法连续段,对应值为 0。折损是可选项:一段已经满足 ∑M≤B 的区间,也可以不折损。
样例1
输入
4 13
80 15 80 15
6 3 6 3
输出
110 160
说明
- 常规:保留 [15,80,15],占用 3+6+3=12≤13,重要度 110。另一段 [80,15,80] 占用 15>13,不合法;[80,15] 合法但重要度只有 95。
- 折损:保留 [80,15,80],对重要度为 15 的块折损,占用变为 6+⌊3/2⌋+6=13≤13,重要度 80+0+80=160。
样例2
输入
5 12
8 16 24 32 40
5 6 7 4 3
输出
72 72
说明
- 常规:保留最后两块 [32,40],占用 4+3=7≤12,重要度 72。[24,32,40] 占用 7+4+3=14>12;[24,32] 占用 11 但重要度只有 56。
- 折损:[24,32,40] 中最不重要的是 24,占用变为 ⌊7/2⌋+4+3=10≤12,重要度 72,不优于常规。[16,24,32] 折损 16 后占用 ⌊6/2⌋+7+4=14>12。