序列最小化

序列最小化

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 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;
}
全部评论

相关推荐

湫湫湫不会java:写的很杂,连自己都不知道找什么工作的感觉,只是要份工作。针对自己稍微有点优势的方向好好整份简历投投吧,然后这杂的简历就辅助投投,因为自己认为的优势可能也不是很大的优势all in可能失业,自己也没有啥很想的方向还是可以用这通用的碰碰运气吧,加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务