[La pensée et la pratique de programmation Semaine5 travail D] fenêtre coulissante

Description du sujet:

Il y a un certain nombre de colonnes de longueur n, et une fenêtre de taille k, la fenêtre peut être déplacée avant et en arrière sur les colonnes. Maintenant , nous voulons savoir quand la fenêtre coulissante de gauche à droite, chaque fenêtre le nombre maximum et minimum étaient . numéro
Par exemple: au nombre de colonnes est [13-1-35367], où k est égal à 3.
Insérer ici l'image Description

Une description:

Entrez deux lignes. La première ligne de deux entiers n et k sont la taille et la longueur de la série de fenêtres coulissantes, 1 <= k <= n <= 1000000. La deuxième rangée a représente n un nombre entier de colonnes.

Entrée de l'échantillon:

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

Description Sortie:

Il y a deux lignes de production. La première ligne de sortie de chaque position de la fenêtre coulissante de gauche à droite, la valeur minimale dans la fenêtre glissante. La deuxième ligne représente la valeur maximale.

Sortie de l'échantillon:

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

idées:

Ce qui est nécessaire est de prendre la taille de la plus grande valeur dans la fenêtre coulissante K, un concept partiel, on peut encore être utilisé avec des idées similaires du travail A qui de façon monotone, plus de valeur pile de façon monotone peut frapper la portée globale, car ici le concept est donc partielle, pour les éléments qui ne sont pas appartiennent à la gamme actuelle devrait être supprimée, de sorte que le premier élément équipe en raison de fenêtre coulissante à droite et peut être retiré, on pense une file d' attente monotone.
Mettre en place une file d' attente de plus en plus de façon monotone, chaque numéro , à son tour poussé, poussé au nombre ne répond pas à la monotonie de la file d' attente, puis le retrait de l' élément de queue, jusqu'à ce que les éléments à presser dans ton monocorde, puis enfoncé dans l'équipe d'affaire le premier élément d'inspecter si la portée actuelle (parce que chaque fois qu'il est seulement un élément pressé en considération que le premier chiffre de l'équipe), sinon une partie de la gamme actuelle, il est supprimé, l'équipe est le premier élément dans une presse l'élément est l'élément le plus petit dans la bordure droite de la fenêtre coulissante jusqu'à enfoncée dans un nombre final, quand ils ont obtenu le minimum de toutes les fenêtres.
De la même façon monotone établir une diminution de la file d' attente, et la valeur maximale pour chaque position de fenêtre.

code:

#include <iostream>
using namespace std;
const int size=1e6+10;
int st[size],val[size];
int Min[size],Max[size];
int l=1,r=0,n,k;
int main(int argc, char** argv) {
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		scanf("%d",val+i);
	for(int i=1;i<=n;i++)
	{
		while(l<=r&&val[st[r]]>val[i]) r--;
		st[++r]=i;
		if(l<=r&&st[r]-st[l]+1>k) l++;
		Min[i]=val[st[l]];
	} 
	l=1;r=0;
	for(int i=1;i<=n;i++)
	{
		while(l<=r&&val[st[r]]<val[i]) r--;
		st[++r]=i;
		if(l<=r&&st[r]-st[l]+1>k) l++;
		Max[i]=val[st[l]];
	} 
	for(int i=k;i<=n;i++)
		printf("%d ",Min[i]);
	printf("\n");
	for(int i=k;i<=n;i++)
		printf("%d ",Max[i]);
	printf("\n");
	return 0;
}
Publié 24 articles originaux · éloge de won 8 · vues 526

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44034698/article/details/104995580
conseillé
Classement