#L0354. Allocator

Allocator

题目背景

小符同学接手了一个轻量级内核的内存分配器(Allocator)模块。由于之前的物理内存管理策略存在缺陷,内存页中布满了碎片。他现在需要找出一块连续的物理内存区域,用来存放一个重要的数据结构。

题目描述

内核的物理内存被划分为 NN 个连续的内存页,状态由一个长度为 NN 的数组表示:0 表示该页空闲,1 表示该页已被占用。

小符需要分配一个长度恰好为 KK 个页的连续内存块。由于系统支持页面迁移,如果选中的长度为 KK 的区域中包含已被占用的页,系统需要将这些占用页迁移走,每迁移一个占用页会产生 1 点“性能损耗”。

请你通过枚举所有可能的连续区间,帮小符计算出分配这 KK 个连续页所能达到的最小性能损耗是多少?

输入格式

第一行包含两个正整数 NNKK,表示物理内存的总页数和需要分配的连续页数。 第二行包含 NN 个用空格分隔的整数(仅为 01),依次表示每个内存页的状态。

输出格式

输出一个整数,表示最小的性能损耗。

数据范围

对于 100% 的数据: 1KN50001 \le K \le N \le 5000

样例

8 3
1 0 1 0 0 0 1 0
0

样例解释

枚举所有长度为 3 的连续区间,计算其包含的 1 的个数(即损耗):

[1, 0, 1] 损耗为 2

[0, 1, 0] 损耗为 1

[1, 0, 0] 损耗为 1

[0, 0, 0] 损耗为 0 (第 4 到第 6 个页)

[0, 0, 1] 损耗为 1

[0, 1, 0] 损耗为 1

最小损耗为 0。