Clasificación rápida + planificación dinámica + detalles de salida 1101 Clasificación rápida (25 puntos)

1101 Clasificación rápida (25 puntos)

Hay un proceso clásico denominado partición en el famoso algoritmo de ordenación rápida. En este proceso, generalmente elegimos un elemento como pivote. Luego, los elementos inferiores al pivote se mueven hacia la izquierda y los más grandes que el pivote hacia la derecha. Dados N enteros positivos distintos después de una ejecución de partición, ¿podría decir cuántos elementos podrían ser el pivote seleccionado para esta partición?

Por ejemplo, dado N = 5 y los números 1, 3, 2, 4 y 5. Tenemos:

1 podría ser el pivote ya que no hay ningún elemento a su izquierda y todos los elementos a su derecha son más grandes que él;
3 no debe ser el pivote ya que aunque todos los elementos a su izquierda son más pequeños, el número 2 a su derecha también es menor que él;
2 no debe ser el pivote ya que aunque todos los elementos a su derecha son más grandes, el número 3 a su izquierda también es más grande que él;
y por la misma razón, 4 y 5 también podrían ser el pivote.
Por lo tanto, en total hay 3 candidatos de pivote.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea da un número entero positivo N (≤10
5
). Entonces la siguiente línea contiene N enteros positivos distintos no mayores que 10
9
. Los números en una línea están separados por espacios.

Especificación de salida:
para cada caso de prueba, escriba en la primera línea el número de candidatos de pivote. Luego, en la línea siguiente, imprima estos candidatos en orden creciente. Debe haber exactamente 1 espacio entre dos números adyacentes, y no hay espacio adicional al final de cada línea.

Entrada de muestra:

5
1 3 2 4 5

Salida de muestra:

3
1 4 5

Resolución de problemas
Dados N números, determine qué números son más pequeños a la izquierda y más grandes a la derecha, y dé salida en orden descendente;
dado que N es 10 ^ 5 como máximo, debe agotar el tiempo de espera cada vez que atraviesa Por lo tanto, se necesita un algoritmo con complejidad por debajo de nlogn;
espacio de programación dinámico para el tiempo;
crear una matriz para almacenar el número más grande a la izquierda de i;
establecer una matriz para contener el número más pequeño
a la derecha de i; Si es mayor que i, entonces se agrega a la matriz de resultados; la matriz de resultados
finalmente se ordena y la salida es suficiente;

Puntos a tener en cuenta
Si la matriz de resultados está vacía, debe generar un avance de línea 0 y luego un avance de línea de salida;
MAXL se inicializa en el primer número, MINI se inicializa en el número N;
MAXL se inicializa en -1, MINR se inicializa en 10e + 9 Esta bien

1. Función de entrada

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//给N个数

//动态规划,记录i和i之前有几个pivot
//maxpivot记录左边最大的pivot

//从右到左遍历一遍
const int MAXN = 100010;
int N;
int NUM[MAXN];
int Maxleft[MAXN];      //从左边开始最大的i 
int Minright[MAXN];     //从右边开始最大的i 

void input(){
	cin>>N;
	for(int i=0;i<N;i++)
	{
		cin>>NUM[i];
	} 
} 

2. Encuentra la función pivote

vector<int> pivot;
void Findpivot()
{
	int MAXL=NUM[0];
	int MINR=NUM[N-1];
	for(int i=0;i<N;i++)
	{
		if(MAXL<NUM[i])
			MAXL=NUM[i];
		
		Maxleft[i]=MAXL;
	}
	
	for(int i=N-1;i>=0;i--)
	{
		if(MINR>NUM[i])
			MINR=NUM[i];
		
		Minright[i]=MINR;
	}
	
	for(int i=0;i<N;i++)
	{
		if(Maxleft[i]==NUM[i]&&Minright[i]==NUM[i])
			pivot.push_back(NUM[i]);
	}

	cout<<pivot.size()<<endl;
	sort(pivot.begin(),pivot.end());
	if(pivot.size()==0) return;
	for(int i=0;i<pivot.size()-1;i++)
		cout<<pivot[i]<<" ";
	cout<<pivot[pivot.size()-1];
}

Función 3.main

int main()
{
	input();
	Findpivot();
}
Publicados 105 artículos originales · ganado elogios 6 · vistas 4934

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105655210
Recomendado
Clasificación