Minimice el elemento máximo de la array dividiendo los elementos de la array en potencias de dos como máximo K veces

Dada una array arr[] que consta de N enteros positivos y un entero K , la tarea es minimizar el valor máximo de la array dividiendo el elemento de la array en potencias de 2 como máximo K veces.

Ejemplos:

Entrada: arr[] = {2, 4, 11, 2}, K = 2
Salida: 2
Explicación:
A continuación se muestran las operaciones realizadas en los elementos de la array como máximo K(= 2) veces:
Operación 1: eliminar el elemento en el índice 2 , es decir, arr[2] = 11 y reemplácelo con 11 números de 1 en él. Ahora la array arr[] se modifica a {2, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}.
Operación 2: Retire el elemento en el índice 1, es decir, arr[1] = 4 y reemplácelo con 4 números de 1 en él. Ahora la array arr[] se modifica a {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2}.

Después de realizar las operaciones anteriores, el valor máximo de la array es 2, que es el valor mínimo posible.

Entrada: arr[]= {9}, K = 2
Salida: 1

Enfoque: El problema dado se puede resolver utilizando el hecho de que cada número se puede expresar como la suma de 1 , que es una potencia de 2 . Siga los pasos a continuación para resolver el problema:

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 find the minimum value
// of the maximum element of the array
// by splitting at most K array element
// into perfect powers of 2
void minimumSize(int arr[], int N, int K)
{
    // Sort the array element in
    // the ascending order
    sort(arr, arr + N);
 
    // Reverse the array
    reverse(arr, arr + N);
 
    // If count of 0 is equal to N
    if (count(arr, arr + N, 0) == N)
        cout << 0;
 
    // Otherwise, if K is greater
    // than or equal to N
    else if (K >= N)
        cout << 1 << endl;
 
    // Otherwise
    else
        cout << arr[K] << endl;
}
 
// Driver Code
int main()
{
    int arr[] = { 2, 4, 8, 2 };
    int K = 2;
    int N = sizeof(arr) / sizeof(arr[0]);
    minimumSize(arr, N, K);
 
    return 0;
}

Java

// Java program for the above approach
import java.lang.*;
import java.util.*;
 
class GFG{
 
// Function to find the minimum value
// of the maximum element of the array
// by splitting at most K array element
// into perfect powers of 2
static void minimumSize(int arr[], int N, int K)
{
     
    // Sort the array element in
    // the ascending order
    Arrays.sort(arr);
 
    // Reverse the array
    reverse(arr);
 
    // If count of 0 is equal to N
    if (count(arr, 0) == N)
        System.out.println(0);
 
    // Otherwise, if K is greater
    // than or equal to N
    else if (K >= N)
        System.out.println(1);
 
    // Otherwise
    else
        System.out.println(arr[K]);
}
 
static void reverse(int[] a)
{
    int i, k, t;
    int n = a.length;
     
    for(i = 0; i < n / 2; i++)
    {
        t = a[i];
        a[i] = a[n - i - 1];
        a[n - i - 1] = t;
    }
}
 
static int count(int[] a, int n)
{
    int freq = 0;
     
    for(int i = 0; i < a.length; i++)
    {
        if (a[i] == n)
            freq++;
    }
    return freq;
}
 
// Driver code
public static void main(String[] args)
{
    int arr[] = { 2, 4, 8, 2 };
    int K = 2;
    int N = arr.length;
     
    minimumSize(arr, N, K);
}
}
 
// This code is contributed by offbeat

Python

# Python program for the above approach
 
# Function to find the minimum value
# of the maximum element of the array
# by splitting at most K array element
# into perfect powers of 2
def minimumSize(arr, N, K):
   
    # Sort the array element in
    # the ascending order
    arr.sort()
     
    # Reverse the array
    arr.reverse()
     
    # If count of 0 is equal to N
    zero = arr.count(0)
    if zero == N:
        print(0)
         
    # Otherwise, if K is greater
    # than or equal to N
    elif K >= N:
        print(1)
         
    # Otherwise
    else:
        print(arr[K])
 
# Driver Code
arr = [2, 4, 8, 2]
K = 2
N = len(arr)
minimumSize(arr, N, K)
 
# This code is contributed by sudhanshugupta2019a.

C#

// C#program for the above approach
using System;
class GFG
{
 
    // Function to find the minimum value
    // of the maximum element of the array
    // by splitting at most K array element
    // into perfect powers of 2
    static void minimumSize(int[] arr, int N, int K)
    {
 
        // Sort the array element in
        // the ascending order
        Array.Sort(arr);
 
        // Reverse the array
        Array.Reverse(arr);
 
        // If count of 0 is equal to N
        if (count(arr, 0) == N)
            Console.WriteLine(0);
 
        // Otherwise, if K is greater
        // than or equal to N
        else if (K >= N)
            Console.WriteLine(1);
 
        // Otherwise
        else
            Console.WriteLine(arr[K]);
    }
 
    static void reverse(int[] a)
    {
        int i, t;
        int n = a.Length;
 
        for (i = 0; i < n / 2; i++) {
            t = a[i];
            a[i] = a[n - i - 1];
            a[n - i - 1] = t;
        }
    }
 
    static int count(int[] a, int n)
    {
        int freq = 0;
 
        for (int i = 0; i < a.Length; i++) {
            if (a[i] == n)
                freq++;
        }
        return freq;
    }
 
    // Driver code
    public static void Main(string[] args)
    {
        int[] arr = { 2, 4, 8, 2 };
        int K = 2;
        int N = arr.Length;
 
        minimumSize(arr, N, K);
    }
}
 
// This code is contributed by ukasp.

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function to find the minimum value
// of the maximum element of the array
// by splitting at most K array element
// into perfect powers of 2
function minimumSize(arr,N,K)
{
    // Sort the array element in
    // the ascending order
    (arr).sort(function(a,b){return a-b;});
  
    // Reverse the array
    reverse(arr);
  
    // If count of 0 is equal to N
    if (count(arr, 0) == N)
        document.write(0);
  
    // Otherwise, if K is greater
    // than or equal to N
    else if (K >= N)
        document.write(1);
  
    // Otherwise
    else
        document.write(arr[K]);
}
 
function reverse(a)
{
    let i, k, t;
    let n = a.length;
      
    for(i = 0; i < n / 2; i++)
    {
        t = a[i];
        a[i] = a[n - i - 1];
        a[n - i - 1] = t;
    }
}
 
function count(a,n)
{
    let freq = 0;
      
    for(let i = 0; i < a.length; i++)
    {
        if (a[i] == n)
            freq++;
    }
    return freq;
}
 
// Driver code
let arr=[2, 4, 8, 2];
let K = 2;
let N = arr.length;
minimumSize(arr, N, K);
 
 
// This code is contributed by avanitrachhadiya2155
 
</script>
Producción: 

2

 

Complejidad de tiempo: O(N * log N)
Espacio auxiliar: O(1)

Otro enfoque eficiente: en el enfoque anterior, estamos ordenando la array y encontramos el (K+1)-ésimo elemento máximo para K<N. En lugar de ordenar la array, podemos usar una cola de prioridad para encontrar el elemento máximo (K+1) .

La complejidad temporal para este enfoque en el peor de los casos es O(N*log(K)) para k<N; de lo contrario, la complejidad temporal es O(1). Por lo tanto, el enfoque dado es mucho mejor que el enfoque anterior para un valor menor de k.

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 find the minimum value
// of the maximum element of the array
// by splitting at most K array element
// into perfect powers of 2
void minimumSize(int arr[], int N, int K)
{
    // If count of 0 is equal to N
    if (count(arr, arr + N, 0) == N)
        cout << 0;
 
    // Otherwise, if K is greater
    // than or equal to N
    else if (K >= N)
        cout << 1 << endl;
 
    // Otherwise
    else
    {
    // Finding (K+1)th maximum element
    // using a priority_queue
    priority_queue<int, vector<int>, greater<int> >pq;
  
    for (int i = 0; i < N; ++i) {
  
        // Insert elements into
        // the priority queue
        pq.push(arr[i]);
  
        // If size of the priority
        // queue exceeds k+1
        if (pq.size() > (K+1)) {
            pq.pop();
        }
    }
    // Print the (K+1)th maximum element
    cout<<pq.top()<<endl;
    }
}
 
// Driver Code
int main()
{
    int arr[] = { 2, 4, 8, 2 };
    int K = 2;
    int N = sizeof(arr) / sizeof(arr[0]);
    minimumSize(arr, N, K);
 
    return 0;
}
 
// This code is contributed by Pushpesh raj
Producción

2

Complejidad de tiempo: O(N*log(K)) 
Espacio auxiliar: O(K)

Publicación traducida automáticamente

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