Programação pensando semana5 lição de casa D-deslizante janela

Título

O ZJM possui uma sequência de comprimento n e uma janela do tamanho k.A janela pode se mover para frente e para trás na sequência.Agora, o ZJM deseja saber quando a janela desliza da esquerda para a direita, os valores máximo e mínimo do número na janela a cada vez. Quanto.
Insira a descrição da imagem aqui

Entrada

Existem duas linhas de entrada. Os dois números inteiros n e k na primeira linha representam o comprimento da sequência e o tamanho da janela deslizante, 1 <= k <= n <= 1000000. Na segunda linha, existem n números inteiros representando a sequência de ZJM.

Resultado

A saída tem duas linhas. A primeira linha gera o valor mínimo da janela deslizante em cada posição, da esquerda para a direita. A segunda linha é o valor máximo.

Entrada de amostra

8 3
1 3 -1 -3 5 3 6 7

Saída de amostra

1 -3 -3 -3 3 3
3 3 5 5 6 7

Idéias

Use filas monótonas.
O processo de manutenção de uma fila monotônica é semelhante à pilha monotônica, exceto que:

  • A pilha monotônica mantém apenas uma extremidade (parte superior da pilha), enquanto a fila monótona pode manter ambas as extremidades (primeira e última)
  • As pilhas monotônicas geralmente mantêm a monotonicidade global, enquanto as filas monotônicas geralmente mantêm a monotonicidade local.O tamanho da pilha monotônica não tem limite superior, enquanto as filas monotônicas geralmente têm limites de tamanho

Use a fila monotonicamente decrescente para encontrar o valor máximo na janela e use a fila monotonicamente crescente para encontrar o valor mínimo na janela.
Ao fazer o loop pela i-ésima vez, o chefe da equipe é o resultado do processamento dos primeiros k elementos, ou seja, o menor / maior dos primeiros k elementos.

Código

#include <cstdio>
#include <queue>
using namespace std;
int a[1000005];
deque<int> q;

int main() {
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<n;i++){
        while (q.size()>0&&q.front()<i-k+1)
            q.pop_front();
        while (q.size()>0&&a[q.back()]>a[i])
            q.pop_back();
        q.push_back(i);
        if(i>=k-1)
            printf("%d ",a[q.front()]);
    }
    q.clear();
    printf("\n");
    for(int i=0;i<n;i++){
        while(q.size()>0&&q.front()<i-k+1)
            q.pop_front();
        while(q.size()>0&&a[q.back()]<a[i])
            q.pop_back();
        q.push_back(i);
        if(i>=k-1)
            printf("%d ",a[q.front()]);
    }
    return 0;
}

Link do título

Publicado 24 artigos originais · elogiado 2 · visitas 435

Acho que você gosta

Origin blog.csdn.net/weixin_43805228/article/details/105174886
Recomendado
Clasificación