题意

给一串1..N的序列,顺序任意,然后从中取出连续k个数字,把他们替换成其中最小的数字。

解析

不难看出,最终所有数字都会变成1。

那么首先我们就会想到先去替换包含1的连续k区间,剩下的就左右跑就行了。但最优的情况一定发生在重叠的长度最少的时候。

不妨假设都只重叠1个数字(最优解的情况),那么此时我们只需要将k --,然后用剪完之后的k再去铺满剩余没有铺满的数字即可。

例如

10 4
2 3 4 5 1 6 7 8 9 10
.........+++++
+++++........++++++

在这个例子中我们首先选取的是5 1 6 7,然后是2 3 4 57 8 9 10,其中5和7都是重叠的数字,那么我们其实可以转化为用k-1来填充,那么剩下的我们只需要填充2 3 48 9 10就行了。

因此我们先求出剩余的数字个数,同时k --:

n -= k --;

之后答案便是先转换的一次区间+剩下铺满需要的次数:

ans = 1 + (int) ceil(n / (double) k); // ceil为向上取整,铺不满的时候肯定需要再多一次的

最终代码:

#include <stdio.h>
#include <math.h>

int main()
{
    int n,k;
    scanf("%d%d",&n,&k);
    int a;
    for (int i = 0;i < n;i ++) {
        scanf("%d",&a);
    }

    n -= k --;
    printf("%d\n",1 + (int) ceil(n / (double) k));
    return 0;
}