Compruebe si los elementos de una array se pueden organizar en un círculo con diferencia consecutiva como 1

Dada una serie de  N 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: 
 

  1. Primero inserte todos los elementos en un conjunto múltiple.
  2. Elimina el primer elemento del conjunto y guárdalo en una variable actual .
  3. 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».
  4. 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

 

Publicación traducida automáticamente

Artículo escrito por SrijaDe y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *