相邻两个复盘窗口只错开一小时,因此上调量 di=ui−vi 沿步长 w 的链被模 q 关系钉死。每个小时最优上调量都可以取在 0∼q−1。
机房值班盯盘要复盘一条按小时记下的负载得分。容量评估规定:每个固定长度的复盘窗口,负载之和必须能被容量档整除,否则这条时间线不能过审。盯盘同学只能把某些小时的得分往上调,并且要让总上调量尽量小。
共有 k 个小时,现有得分是 v1,v2,…,vk。上调后的得分记为 u1,u2,…,uk,必须满足 ui≥vi。复盘窗口长度是 w,容量档是 q。对每一个起点 p(1≤p≤k−w+1),都要有
(up+up+1+⋯+up+w−1)modq=0。
在所有合法的 u 里,请计算 ∑i=1k(ui−vi) 的最小值。
注意:输入保证 0≤vi<q,但构造出的 ui 不必再落在这个范围内。
小时数和容量档满足 1≤k,q≤5×102,窗长满足 1≤w≤k。
第一行三个正整数 k、q、w(1≤k,q≤5×102,1≤w≤k),表示小时数、容量档和复盘窗口长度。
第二行 k 个整数 v1,v2,…,vk(0≤vi<q),表示现有小时负载得分。
输出一个整数,即最少还要上调的得分总和。
输入
3 4 2
1 1 1
输出
2
说明
两个窗口原来的和都是 2,要变成 4 的倍数。一种办法是调成 1,3,1,两个窗口和都是 4,一共只上调了 2。
输入
1 3 1
0
输出
0
说明
只有一个小时、窗长为 1,得分 0 已经能被 3 整除,不用上调。
输入
4 6 2
1 2 3 4
输出
8
说明
一种最优构造是 4,2,4,8。三个窗口的和分别是 6、6、12,都能被 6 整除,总上调量为 8。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.