2356. 连续子区间等值化的最小代价

1000ms 256MB 简单 前缀和与差分
题目描述
给定一个长度为 $N$ 的正整数序列 $A$,序列中的所有元素互不相同。每次操作可以将序列中的任意一个元素加 1 或减 1,每次操作的代价为 1。 求最少需要多少次操作,使得序列中存在连续的 $K$ 个元素,它们的值全部相等。
输入格式
- 第一行包含两个正整数 $N$ 和 $K$ ($1 \le K \le N \le 1000$)。 - 第二行包含 $N$ 个互不相同的正整数 $a_i$ ($1 \le a_i \le 1000$),代表序列的初始元素。
输出格式
- 输出一个整数,表示最少的操作次数。
样例 1
输入 (Input)
3 2
3 6 1
输出 (Output)
3
样例说明
序列为 `3 6 1`,要求 $K = 2$ 个相邻元素相等。 - 选择前 2 个相邻元素 `3` 和 `6`:若将它们都变为 5,代价为 $|3 - 5| + |6 - 5| = 3$(也可以变为 3、4 或 6,最小代价均为 3)。 - 选择后 2 个相邻元素 `6` 和 `1`:若将它们都变为 1(或 6),最小代价为 $|6 - 1| = 5$。 - 综上,最少操作次数为 3。
- 对于 $100\%$ 的数据:$1 \le K \le N \le 1000$,且 $1 \le a_i \le 1000$,序列中元素互不相同。 - **算法提示**: 这是一个经典的**中位数**问题。 对于任意一个大小为 $K$ 的窗口 $\{x_1, x_2, \dots, x_K\}$,要使它们全部变为同一个数 $y$ 且操作代价最小,这个数 $y$ 必须是该窗口内所有元素排序后的**中位数**。 1. 利用滑动窗口,枚举所有可能的长度为 $K$ 的连续子区间。 2. 对于每个子区间,将其复制并排序,找出中位数(即排序后下标为 $K/2$ 的元素)。 3. 计算该子区间内所有元素到中位数的绝对差值之和。 4. 比较所有区间的代价,输出最小值。
自测终端 stdin → stdout
输入 stdin
CtrlShiftEnter
输出 stdout

                
错误 stderr

                
CtrlEnter提交
自动保存已开启
操作成功
wzs_oj@kernel:~ — wzs-sh
guest@wzsoj:~$
刷新页面 F5
复制 Ctrl+C
粘贴 Ctrl+V
搜索题目
站点公告
今日神谕
CSP 倒计时
排行榜
我的提交
Esc 关闭 Enter 跳转 支持模糊匹配数字