Skip to content

Commit

Permalink
Add files via upload
Browse files Browse the repository at this point in the history
  • Loading branch information
JuanRomo-dev authored Nov 11, 2022
1 parent 54b8a37 commit bfccc2e
Showing 1 changed file with 37 additions and 6 deletions.
43 changes: 37 additions & 6 deletions Source.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,42 @@
#include <vector>
using namespace std;

struct tSolucion{
/* El coste del algorimo es O(N) en el caso peor, siendo n el número de elementos del vector, ya que en el caso peor vamos a recorrer el vector al completo.
*
* La recurrencia es:
*
* | c1 si n = 1
* T(n) = | c2 si n = 2
* | T(n)/2 + c3 si n > 2
*
*/

struct tSolucion {
int maximo;
int minimo;
bool
bool estaParcialmenteOrdenado;
};

// función que resuelve el problema
TipoSolucion resolver(TipoDatos datos) {

tSolucion resolver(vector<int>& v, int ini, int fin ) {
if (ini == fin) { // Si sólo hay un elemento.
return { 0, 0, true };
}
else if (fin - ini == 1) { // Si los elementos están seguidos en las posiciones
if (v[fin] >= v[ini]) { // Calculamos el máximo y el mínimo de esos 2 elementos.
return { v[fin], v[ini], true };
}

}
else {
int mitad = (ini + fin) / 2; // Calculamos la mitad del subvector para dividirlo en dos.
tSolucion izq = resolver(v, ini, mitad); // Resolvemos por la izquierda
tSolucion der = resolver(v, mitad + 1, fin); // Resolvemos por la derecha
if (izq.estaParcialmenteOrdenado && der.estaParcialmenteOrdenado && izq.minimo <= der.minimo && der.maximo >= izq.maximo) { // Si ambos lados están parcialmente ordenados y además se cumple que el mínimo de la izquierda
return { 0, 0, true }; // es menor o igual que el de la derecha y que el máximo de la derecha es mayor o igual que el de la izquierda.
}
}
return { 0, 0, false }; // Si no llega a cumplirse ninguna de las condiciones, entonces devolveremos false ya que no está parcialmente ordenado.
}

// Resuelve un caso de prueba, leyendo de la entrada la
Expand All @@ -35,12 +61,17 @@ bool resuelveCaso() {
cin >> aux;
}

TipoSolucion sol = resolver(datos);
tSolucion sol = resolver(v, 0, v.size()-1);

// escribir sol
if (sol.estaParcialmenteOrdenado) {
cout << "SI\n";
}
else {
cout << "NO\n";
}

return true;

}

int main() {
Expand Down

0 comments on commit bfccc2e

Please sign in to comment.