Dada una serie de números. La tarea es comprobar si es posible organizar todos los números en un círculo de modo que dos números vecinos difieran exactamente en 1. Escriba «SÍ» si es posible obtener tal disposición y «NO» en caso contrario.
Ejemplos:
Input: arr[] = {1, 2, 3, 2} Output: YES The circle formed is: 1 2 2 3 Input: arr[] = {3, 5, 8, 4, 7, 6, 4, 7} Output: NO
A continuación se muestra el algoritmo paso a paso para resolver este problema:
- Primero inserte todos los elementos en un conjunto múltiple.
- Elimina el primer elemento del conjunto y guárdalo en una variable actual .
- Recorra hasta que el tamaño de multiset se reduzca a 0.
- Eliminar elementos que sean 1 mayor o 1 menor que el valor actual .
- Si hay un valor con una diferencia superior a 1, entonces «no es posible ningún círculo».
- Verifique si los valores inicial y final de la variable actual son iguales, imprima «SÍ» si es así, de lo contrario imprima «NO».
A continuación se muestra la implementación del enfoque anterior:
CPP
// C++ program to check if elements of array // can be arranged in Circle with consecutive // difference as 1 #include <bits/stdc++.h> using namespace std; // Function to check if elements of array can // be arranged in Circle with consecutive // difference as 1 int circlePossible(int arr[], int n) { multiset<int> s; // Initialize the multiset with array // elements for (int i = 0; i < n; i++) s.insert(arr[i]); // Get a pointer to first element int cur = *s.begin(); // Store the first element in a temp variable int start = cur; // Remove the first element s.erase(s.begin()); // Traverse until multiset is non-empty while (s.size()) { // Elements which are 1 greater than the // current element, remove their first occurrence // and increment curr if (s.find(cur + 1) != s.end()) s.erase(s.find(++cur)); // Elements which are 1 less than the // current element, remove their first occurrence // and decrement curr else if (s.find(cur - 1) != s.end()) s.erase(s.find(--cur)); // If the set is non-empty and contains element // which differs by curr from more than 1 // then circle is not possible return else { cout << "NO"; return 0; } } // Finally, check if curr and first differs by 1 if (abs(cur - start) == 1) cout << "YES"; else cout << "NO"; return 0; } // Driver code int main() { int arr[] = { 1, 1, 2, 2, 2, 3 }; int n = sizeof(arr) / sizeof(arr[0]); circlePossible(arr, n); return 0; }
Producción:
YES