Minimice los pasos para crear un Array dado agregando potencias de 2

Dada una array A[] que tiene N enteros positivos, la tarea es encontrar el número mínimo de pasos para construir esta array a partir de una array inicial de tamaño N que tiene todos 0 s siguiendo las siguientes operaciones:

  • Seleccione cualquier subsecuencia de la array.
  • Suma cualquier potencia de 2 a cada elemento de la subsecuencia.

Ejemplos:

Entrada: A = {5, 5, 5}, N = 3
Salida: 2
Explicación: Inicialmente, A = {0, 0, 0}
Primero, agregue 4 (2 2 ) a todos los elementos de A.
A se convierte en {4, 4, 4}.
Luego, agregue 1 (2 0 ) a todos los elementos de A.
A ahora se convierte en {5, 5, 5}
Por lo tanto, se requirieron dos operaciones para igualar A2 y A1.

Entrada: A1 = [5, 2, 1], N = 3
Salida: 3

 

Planteamiento: La solución al problema se basa en el siguiente concepto matemático:

Cada número se puede expresar como la suma de los exponentes de 2, es decir, la representación binaria.
Para obtener un número en pasos mínimos sumando potencias de 2 a 0, necesitamos sumar solo las potencias de los bits establecidos.
Para minimizar el paso de formación de la array, la opción óptima es seleccionar todos los elementos que tienen un bit en la misma posición a la vez y realizar la operación en todos ellos.

Por lo tanto, el problema se reduce a encontrar el número total de posiciones de bits establecidas únicas en todos los elementos de la array .

Siga los pasos mencionados a continuación para implementar la idea:

  • Como necesitamos los bits establecidos únicos entre todos los elementos de la array, debemos realizar el OR bit a bit de todos los elementos y contar los bits establecidos de ese valor.
  • Inicialice una variable (por ejemplo, X ) para almacenar el OR bit a bit de todos los elementos de la array.
  • Iterar a través de todos los elementos de la array:
    • Realice la operación OR bit a bit con X .
  • Calcule los bits establecidos en X .
  • El conteo de bits establecidos es la respuesta requerida.

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

C++

// C++ code for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate the minimum steps
int  minimumOperations(int A[],int n){
     
    // Initially, bitwise Or is
    // equal to first element of the array
    int bitwiseOr = A[0];
     
    // Calculating the bitwise OR
    // with each element in the array
    for(int i=1;i<n;i++)
        bitwiseOr |= A[i];
         
    // Calculating the number of set
    // bits in the bitwise OR
    int ans = __builtin_popcount(bitwiseOr);
     
    // Return the number of set bits
    // as the required answer
    return ans;
}
// Driver Code
int main()
{
    int A[]= {5, 2, 1};
    int N = 3;
     
    //Function Call
    cout<<(minimumOperations(A, N));
}
// This code is contributed by Potta Lokesh

Java

// Java code for the above approach
public class GFG {
     
    // recursive function to count set bits
    public static int countSetBits(int n)
    {
   
        // base case
        if (n == 0)
            return 0;
   
        else
   
            // if last bit set add 1 else add 0
            return (n & 1) + countSetBits(n >> 1);
    }
     
    // Function to calculate the minimum steps
    static int  minimumOperations(int A[],int n){
         
        // Initially, bitwise Or is
        // equal to first element of the array
        int bitwiseOr = A[0];
         
        // Calculating the bitwise OR
        // with each element in the array
        for(int i=1;i<n;i++)
            bitwiseOr |= A[i];
             
        // Calculating the number of set
        // bits in the bitwise OR
        int ans = countSetBits(bitwiseOr);
         
        // Return the number of set bits
        // as the required answer
        return ans;
    }
 
    // Driver Code
    public static void main (String[] args)
    {
        int A[]= {5, 2, 1};
        int N = 3;
         
        //Function Call
        System.out.println(minimumOperations(A, N));
    }
     
}
 
// This code is contributed by AnkThon

Python3

# Python3 code to implement the approach
 
# Function to calculate the minimum steps
def minimumOperations(A, n):
     
    # Initially, bitwise Or is
    # equal to first element of the array
    bitwiseOr = A[0]
     
    # Calculating the bitwise OR
    # with each element in the array
    for i in range(1, n):
        bitwiseOr |= A[i]
         
    # Calculating the number of set
    # bits in the bitwise OR
    ans = bin(bitwiseOr).count("1")
     
    # Return the number of set bits
    # as the required answer
    return ans
 
#Driver Code
if __name__ == '__main__':
    A = [5, 2, 1]
    N = 3
     
    #Function Call
    print(minimumOperations(A, N))

C#

// C# program to implement above approach
using System;
using System.Collections;
using System.Collections.Generic;
 
class GFG
{
 
  // recursive function to count set bits
  static int countSetBits(int n)
  {
 
    // base case
    if (n == 0)
      return 0;
 
    else
 
      // if last bit set add 1 else add 0
      return (n & 1) + countSetBits(n >> 1);
  }
 
  // Function to calculate the minimum steps
  static int minimumOperations(int[] A, int n)
  {
 
    // Initially, bitwise Or is
    // equal to first element of the array
    int bitwiseOr = A[0];
 
    // Calculating the bitwise OR
    // with each element in the array
    for(int i = 1 ; i < n ; i++){
      bitwiseOr |= A[i];
    }
 
    // Calculating the number of set
    // bits in the bitwise OR
    int ans = countSetBits(bitwiseOr);
 
    // Return the number of set bits
    // as the required answer
    return ans;
  }
 
  public static void Main(string[] args){
 
    int[] A = new int[]{5, 2, 1};
    int N = 3;
 
    //Function Call
    Console.WriteLine(minimumOperations(A, N));
 
  }
}
 
// This code is contributed by entertain2022.

Javascript

<script>
 
// JavaScript code for the above approach
     
    // recursive function to count set bits
    function countSetBits(n)
    {
   
        // base case
        if (n == 0)
            return 0;
   
        else
   
            // if last bit set add 1 else add 0
            return (n & 1) + countSetBits(n >> 1);
    }
     
    // Function to calculate the minimum steps
    function minimumOperations(A,n){
         
        // Initially, bitwise Or is
        // equal to first element of the array
        let bitwiseOr = A[0];
         
        // Calculating the bitwise OR
        // with each element in the array
        for(let i=1;i<n;i++)
            bitwiseOr |= A[i];
             
        // Calculating the number of set
        // bits in the bitwise OR
        let ans = countSetBits(bitwiseOr);
         
        // Return the number of set bits
        // as the required answer
        return ans;
    }
 
// Driver Code
 
let A = [5, 2, 1];
let N = 3;
 
//Function Call
document.write(minimumOperations(A, N),"</br>");
 
// This code is contributed by shinjanpatra
 
</script>
Producción

3

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

Publicación traducida automáticamente

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