题意
给定一个仅包含000和111的数组,仅能交换其中相邻的两个数字,问至少多少次这样的操作可以使得至少kkk个111相邻。
题解
取数组中任意kkk个相距最近的111,设它们出现的下标分别为a1,a2,...,ak.a_1,a_2,...,a_k.a1,a2,...,ak.考虑将它们交换多少次可以使得它们聚成连续的kkk个111。有这样一个常用结论:对于数轴上的点a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak,使它们移动到一处的最小代价当它们都移动到该序列的中位数时取得(若长度为偶数,左边的和右边的均可)。按照这个结论,我们要将所有的111都移动到a1,a2,...,aka_1,a_2,...,a_ka1,a2,...,ak的中位数旁边。先讨论
(1)(1)(1)长度k=2n+1k=2n+1k=2n+1即kkk为奇数的情况:
要将a1,a2,...,an+1,...,a2n,a2n+1a_1,a_2,...,a_{n+1},...,a_{2n},a_{2n+1}a1,a2,...,an+1,...,a2n,a2n+1移动到an+1a_{n+1}an+1处,
首先将an,an+2a_{n},a_{n+2}an,an+2移动到an+1a_{n+1}an+1的左右两边,其消耗为(an+1−an−1)+(an+2−an+1−1);(a_{n+1}-a_n-1)+(a_{n+2}-a_{n+1}-1);(an+1−an−1)+(a