diff --git a/Source.cpp b/Source.cpp index d327b9e..a421d9b 100644 --- a/Source.cpp +++ b/Source.cpp @@ -7,16 +7,42 @@ #include 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& 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 @@ -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() {