序列最小化
序列最小化
http://www.nowcoder.com/questionTerminal/f373dab6129a466d87489931213fd882
题意
给一串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 5
和7 8 9 10
,其中5和7都是重叠的数字,那么我们其实可以转化为用k-1来填充,那么剩下的我们只需要填充2 3 4
和8 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; }