Verifique si la array se puede ordenar intercambiando pares con GCD de conjunto de bits igual al del elemento de array más pequeño

Dada una array arr[] que consta de N enteros, la tarea es verificar si es posible ordenar la array utilizando las siguientes operaciones de intercambio:

El intercambio de dos números es válido solo si el máximo común divisor de la cuenta de bits establecidos de los dos números es igual al número de bits establecidos en el elemento más pequeño de la array. 
 

Si es posible ordenar la array realizando solo los intercambios anteriores, imprima «Sí» . De lo contrario, escriba “No” .

Ejemplos:

Entrada: arr[] = {2, 3, 5, 7, 6} 
Salida: Sí 
Explicación: 
se necesita intercambiar 7 y 6 para ordenar la array. 
7 tiene 3 bits establecidos y 6 tiene 2 bits establecidos. 
Dado que GCD(2, 3) = 1, que es igual al número de bits establecidos en el entero más pequeño de la array, es decir, 2 (1 bit establecido). 
Por lo tanto, la array se puede ordenar intercambiando (7, 6).

Entrada: arr[] = {3, 3, 15, 7} 
Salida: No 
Explicación: 
se necesita intercambiar 15 y 7 para ordenar la array. 
15 tiene 4 bits establecidos y 7 tiene 3 bits establecidos. GCD(4, 3) = 1, que no es igual al número de bits establecidos en el entero más pequeño de la array, es decir, 3 (2 bits establecidos). 
Por lo tanto, la array no se puede ordenar. 

Enfoque: siga los pasos a continuación para resolver el problema:

  1. Ordene la array dada y guárdela en una array auxiliar (digamos dup[] ).
  2. Itere sobre la array y para cada elemento, verifique si está en el mismo índice tanto en arr[] como en dup[] o no. Si se encuentra que es cierto, continúe con el siguiente índice.
  3. De lo contrario, si se requiere intercambiar los elementos de posición i -ésima y j -ésima en arr[] , calcule el GCD de los bits establecidos de arr[i] con los bits establecidos de arr[j] y verifique si es igual al recuento de bits establecidos en el elemento más pequeño de la array o no.
  4. Si no se permite ningún intercambio de este tipo, escriba «No» . De lo contrario, escriba «Sí» .

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to count number of set
// bits in an integer
int calculateSetBit(int n)
{
    int count = 0;
 
    // Traverse every bits
    for (int i = 0; i < 32; i++) {
        if (n & 1)
            count++;
 
        // Right shift by 1
        n = n >> 1;
    }
 
    return count;
}
 
// Function to check if sorting the
// given array is possible or not
void sortPossible(int arr[], int n)
{
    // Duplicate array
    int dup[n];
 
    for (int i = 0; i < n; i++)
        dup[i] = arr[i];
 
    // Sorted array to check if the
    // original array can be sorted
    sort(dup, dup + n);
 
    // Flag variable to check
    // if possible to sort
    bool flag = 1;
 
    // Calculate bits of smallest
    // array element
    int bit = calculateSetBit(dup[0]);
 
    // Check every wrong placed
    // integer in the array
    for (int i = 0; i < n; i++) {
        if (arr[i] != dup[i]) {
 
            // Swapping only if GCD of set
            // bits is equal to set bits in
            // smallest integer
            if (__gcd(
                    calculateSetBit(arr[i]),
                    bit)
                != bit) {
                flag = 0;
                break;
            }
        }
    }
 
    // Print the result
    if (flag) {
        cout << "Yes";
    }
    else {
        cout << "No";
    }
 
    return;
}
 
// Driver Code
int main()
{
    int arr[] = { 3, 9, 12, 6 };
 
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    sortPossible(arr, N);
 
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
import java.util.*;
 
class GFG{
  
// Recursive function to return
// gcd of a and b
static int gcd(int a, int b)
{
     
    // Everything divides 0 
    if (a == 0)
        return b;
    if (b == 0)
         return a;
        
    // Base case
    if (a == b)
        return a;
        
    // a is greater
    if (a > b)
        return gcd(a - b, b);
    return gcd(a, b - a);
}
     
// Function to count number of set
// bits in an integer
static int calculateSetBit(int n)
{
    int count = 0;
  
    // Traverse every bits
    for(int i = 0; i < 32; i++)
    {
        if ((n & 1) != 0)
            count++;
  
        // Right shift by 1
        n = n >> 1;
    }
    return count;
}
  
// Function to check if sorting the
// given array is possible or not
static void sortPossible(int arr[], int n)
{
     
    // Duplicate array
    int dup[] = new int[n];
  
    for(int i = 0; i < n; i++)
        dup[i] = arr[i];
  
    // Sorted array to check if the
    // original array can be sorted
    Arrays.sort(dup);
  
    // Flag variable to check
    // if possible to sort
    int flag = 1;
  
    // Calculate bits of smallest
    // array element
    int bit = calculateSetBit(dup[0]);
  
    // Check every wrong placed
    // integer in the array
    for(int i = 0; i < n; i++)
    {
        if (arr[i] != dup[i])
        {
             
            // Swapping only if GCD of set
            // bits is equal to set bits in
            // smallest integer
            if (gcd(calculateSetBit(
                arr[i]), bit) != bit)
            {
                flag = 0;
                break;
            }
        }
    }
  
    // Print the result
    if (flag != 0)
    {
        System.out.println("Yes");
    }
    else
    {
        System.out.println("No");
    }
    return;
}
  
// Driver Code
public static void main(String[] args)
{
    int arr[] = { 3, 9, 12, 6 };
  
    int N = arr.length;
  
    // Function call
    sortPossible(arr, N);
}
}
 
// This code is contributed by sanjoy_62

Python3

# Python3 program for the above approach
from math import gcd
 
# Function to count number of set
# bits in an eger
def calculateSetBit(n):
 
    count = 0
 
    # Traverse every bits
    for i in range(32):
        if (n & 1):
            count += 1
 
        # Right shift by 1
        n = n >> 1
         
    return count
 
# Function to check if sorting the
# given array is possible or not
def sortPossible(arr, n):
 
    # Duplicate array
    dup = [0] * n
 
    for i in range(n):
        dup[i] = arr[i]
 
    # Sorted array to check if the
    # original array can be sorted
    dup = sorted(dup)
 
    # Flag variable to check
    # if possible to sort
    flag = 1
 
    # Calculate bits of smallest
    # array element
    bit = calculateSetBit(dup[0])
 
    # Check every wrong placed
    # eger in the array
    for i in range(n):
        if (arr[i] != dup[i]):
 
            # Swapping only if GCD of set
            # bits is equal to set bits in
            # smallest eger
            if (gcd(calculateSetBit(arr[i]), bit) != bit):
                flag = 0
                break
 
    # Print the result
    if (flag):
        print("Yes")
    else:
        print("No")
 
    return
 
# Driver Code
if __name__ == '__main__':
     
    arr = [ 3, 9, 12, 6 ]
 
    N = len(arr)
 
    # Function call
    sortPossible(arr, N)
 
# This code is contributed by mohit kumar 29

C#

// C# program for the above approach 
using System;
 
class GFG{
  
// Recursive function to return
// gcd of a and b
static int gcd(int a, int b)
{
     
    // Everything divides 0 
    if (a == 0)
        return b;
    if (b == 0)
         return a;
        
    // Base case
    if (a == b)
        return a;
        
    // a is greater
    if (a > b)
        return gcd(a - b, b);
    return gcd(a, b - a);
}
     
// Function to count number of set
// bits in an integer
static int calculateSetBit(int n)
{
    int count = 0;
  
    // Traverse every bits
    for(int i = 0; i < 32; i++)
    {
        if ((n & 1) != 0)
            count++;
  
        // Right shift by 1
        n = n >> 1;
    }
    return count;
}
  
// Function to check if sorting the
// given array is possible or not
static void sortPossible(int[] arr, int n)
{
     
    // Duplicate array
    int[] dup = new int[n];
  
    for(int i = 0; i < n; i++)
        dup[i] = arr[i];
  
    // Sorted array to check if the
    // original array can be sorted
    Array.Sort(dup);
  
    // Flag variable to check
    // if possible to sort
    int flag = 1;
  
    // Calculate bits of smallest
    // array element
    int bit = calculateSetBit(dup[0]);
  
    // Check every wrong placed
    // integer in the array
    for(int i = 0; i < n; i++)
    {
        if (arr[i] != dup[i])
        {
             
            // Swapping only if GCD of set
            // bits is equal to set bits in
            // smallest integer
            if (gcd(calculateSetBit(
                arr[i]), bit) != bit)
            {
                flag = 0;
                break;
            }
        }
    }
  
    // Print the result
    if (flag != 0)
    {
        Console.WriteLine("Yes");
    }
    else
    {
        Console.WriteLine("No");
    }
  
    return;
}
  
// Driver Code
public static void Main()
{
    int[] arr = { 3, 9, 12, 6 };
  
    int N = arr.Length;
  
    // Function call
    sortPossible(arr, N);
}
}
 
// This code is contributed by sanjoy_62

Javascript

<script>
 
// JavaScript program to implement
// the above approach
 
// Recursive function to return
// gcd of a and b
function gcd(a, b)
{
      
    // Everything divides 0
    if (a == 0)
        return b;
    if (b == 0)
         return a;
         
    // Base case
    if (a == b)
        return a;
         
    // a is greater
    if (a > b)
        return gcd(a - b, b);
    return gcd(a, b - a);
}
      
// Function to count number of set
// bits in an integer
function calculateSetBit(n)
{
    let count = 0;
   
    // Traverse every bits
    for(let i = 0; i < 32; i++)
    {
        if ((n & 1) != 0)
            count++;
   
        // Right shift by 1
        n = n >> 1;
    }
    return count;
}
   
// Function to check if sorting the
// given array is possible or not
function sortPossible(arr, n)
{
      
    // Duplicate array
    let dup = [];
   
    for(let i = 0; i < n; i++)
        dup[i] = arr[i];
   
    // Sorted array to check if the
    // original array can be sorted
    dup.sort();
   
    // Flag variable to check
    // if possible to sort
    let flag = 1;
   
    // Calculate bits of smallest
    // array element
    let bit = calculateSetBit(dup[0]);
   
    // Check every wrong placed
    // integer in the array
    for(let i = 0; i < n; i++)
    {
        if (arr[i] != dup[i])
        {
              
            // Swapping only if GCD of set
            // bits is equal to set bits in
            // smallest integer
            if (gcd(calculateSetBit(
                arr[i]), bit) != bit)
            {
                flag = 0;
                break;
            }
        }
    }
   
    // Print the result
    if (flag != 0)
    {
        document.write("Yes");
    }
    else
    {
        document.write("No");
    }
    return;
}
 
// Driver code
    let arr = [ 3, 9, 12, 6 ];
    let N = arr.length;
   
    // Function call
    sortPossible(arr, N);
      
     // This code is contributed by target_2.
</script>
Producción: 

Yes

 

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por pradyumanagarwal 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 *