队列运用#扫描#洛谷/C语言

题目描述

有一个 1×n 的矩阵,有 n 个整数。

现在给你一个可以盖住连续 k 个数的木板。

一开始木板盖住了矩阵的第 1∼k 个数,每次将木板向右移动一个单位,直到右端与第 �n 个数重合。

每次移动前输出被覆盖住的数字中最大的数是多少。

输入格式

第一行两个整数 n,k,表示共有 n 个数,木板可以盖住 k 个数。

第二行 n 个整数,表示矩阵中的元素。

输出格式

共 n−k+1 行,每行一个整数。

第 i 行表示第 i∼i+k−1 个数中最大值是多少。

输入输出样例

输入 #1复制

5 3
1 5 3 4 2

输出 #1复制

5
5
4

说明/提示

对于 20%20% 的数据,1≤k≤n≤103。

对于 50%50% 的数据,1≤k≤n≤104。

对于 100%100% 的数据1≤k≤n≤2×106,矩阵中的元素大小不超过 104 并且均为正整数。

在本题目中,由于需要用到队列,所以在起初我们就要设置一个头(head)和尾(tail),随着头尾推进,我们可以先找出1~k中的最大值,然后在推进中将入队列的数和最大的数相比较,如果比最大的数大,则将它的下标覆盖前一个最大数的下标,但是我们需要考虑一个问题———如果木板持续推进,直到最大的数出队列,都再没有一个数比这个数大,那么我们需要在这个全新覆盖的k个数里找到最大的数,继续推进,如此,我们就可以将找最大数单独拎出来形成一个自定义函数(maax),代码如下

#include
int a[2100000];
int maax(int head,int k)
{
    int m=head;
     for(int i=head;i=head)
        {
            if(a[i]>=a[m])
            {
                m=i;
            }
            printf("%d\n",a[m]);
            head++;
        }
        else if(m

你可能感兴趣的:(c语言,算法)