Minimice la resta de los elementos de la array para hacer que X sea 0 como máximo

Dado un número X y una array arr[] de longitud N que contiene los N números. La tarea es encontrar el número mínimo de operaciones requeridas para hacer que X no sea positivo. En una operación:

  • Seleccione cualquier número Y de la array y reduzca X por Y
  • Luego haga Y = Y/2 (tome el valor mínimo si Y es impar).
  • Si no es posible hacer que X no sea positivo, devuelva -1 .

Ejemplos:

Entrada: N = 3, arr[] = {3, 4, 12}, X = 25
Salida : 4
Explicación: Operación 1: Y=12, X se reduce a 13, Y se convierte en 6, arr[]: {3, 4 , 6}
Operación 2: Y = 6, X se reduce a 7, Y se convierte en 3, arr[]: {3, 4, 3}
Operación 3: Y = 4, X se reduce a 3, Y se convierte en 2, arr[]: {3, 2, 3}
Operación 4: Y = 3, X se reduce a 0, Y se convierte en 1, arr[]: {1, 2, 3}
El total de operaciones será 4.

Entrada:  N = 3, arr[] = {11, 11, 110}, X = 11011
Salida: -1
Explicación: Es imposible hacer que X no sea positivo

 

Enfoque : este problema se puede resolver usando max-heap ( priority queue ) basado en la siguiente idea:

Para minimizar la resta, es óptimo restar el valor máximo cada vez. Por esta razón, use un montón máximo para que los números de valor máximo permanezcan en la parte superior y realice la operación utilizando el elemento superior y siga verificando si el número se vuelve no positivo o no.

Siga la siguiente ilustración para una mejor comprensión.

Ilustración:

Considere arr[] = {3, 4, 12} y X = 25

Entonces max heap (digamos P ) = [3, 4, 12]

1er paso:
        => Elemento máximo (Y) = 12.
        => Restar 12 de 25. X = 25 – 12 = 13. Y = 12/2 = 6.
        => P = {3, 4, 6}.

2do paso:
        => Elemento máximo (Y) = 6.
        => Restar 6 de 13. X = 13 – 6 = 7. Y = 6/2 = 3.
        => P = {3, 3, 4}.

3er paso:
        => Elemento máximo (Y) = 4.
        => Reste 4 de 7. X = 7 – 4 = 3. Y = 4/2 = 2.
        => P = {2, 3, 3}.

4to paso:
        => Elemento máximo (Y) = 3.
        => Restar 3 de 3. X = 3 – 3 = 0. Y = 3/2 = 1.
        => P = {1, 2, 3}.

X no es positivo. Entonces operaciones requeridas = 4

Siga los pasos para resolver el problema:

  • Cree un montón máximo (implementado por la cola de prioridad) y almacene todos los números en él.
  • Realice lo siguiente hasta que la cola de prioridad no esté vacía y la X sea positiva.
    • Utilice el número que tiene el valor máximo. Este será el número en la parte superior de la cola de prioridad.
    • Elimine el número superior de la cola de prioridad y realice la operación como se indica en el problema.
    • Después de realizar la operación, si Y es positivo, agréguelo nuevamente a la cola de prioridad.
    • Incrementa la respuesta en 1 cada vez.
  • Después de completar el proceso anterior, si X es positivo, entonces es imposible convertirlo en no positivo y, por lo tanto, devolver -1.
  • De lo contrario, devuelve la respuesta.

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

C++

// C++ code to implement the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find minimum operations
int minimumOperations(int N, int X,
                      vector<int> nums)
{
 
    // Initialize answer as zero
    int ans = 0;
 
    // Create Max-Heap using
    // Priority-queue
    priority_queue<int> pq;
 
    // Put all nums in the priority queue
    for (int i = 0; i < N; i++)
        pq.push(nums[i]);
 
    // Execute the operation on num with
    // max value until nums are left
    // and X is positive
    while (!pq.empty() and X > 0) {
        if (pq.top() == 0)
            break;
 
        // Increment the answer everytime
        ans++;
 
        // num with maximum value
        int num = pq.top();
 
        // Removing the num
        pq.pop();
 
        // Reduce X's value and num's
        // value as per the operation
        X -= num;
        num /= 2;
 
        // If the num's value is positive
        // insert back in the
        // priority queue
        if (num > 0)
            pq.push(num);
    }
 
    // If X's value is positive then it
    // is impossible to make X
    // non-positive
    if (X > 0)
        return -1;
 
    // Otherwise return the number of
    // operations performed
    return ans;
}
 
// Drivers code
int main()
{
    int N = 3;
    vector<int> nums = { 3, 4, 12 };
    int X = 25;
 
    // Function call
    cout << minimumOperations(N, X, nums);
    return 0;
}

Java

// Java code to implement the above approach
import java.io.*;
import java.util.*;
 
class GFG
{
 
  // Function to find minimum operations
  public static int minimumOperations(int N, int X,
                                      int nums[])
  {
 
    // Initialize answer as zero
    int ans = 0;
 
    // Create Max-Heap using
    // Priority-queue
    PriorityQueue<Integer> pq = new PriorityQueue<>(
      Collections.reverseOrder());
 
    // Put all nums in the priority queue
    for (int i = 0; i < N; i++)
      pq.add(nums[i]);
 
    // Execute the operation on num with
    // max value until nums are left
    // and X is positive
    while (!pq.isEmpty() && X > 0) {
      if (pq.peek() == 0)
        break;
 
      // Increment the answer everytime
      ans++;
 
      // num with maximum value
      int num = pq.peek();
 
      // Removing the num
      pq.poll();
 
      // Reduce X's value and num's
      // value as per the operation
      X -= num;
      num /= 2;
 
      // If the num's value is positive
      // insert back in the
      // priority queue
      if (num > 0)
        pq.add(num);
    }
 
    // If X's value is positive then it
    // is impossible to make X
    // non-positive
    if (X > 0)
      return -1;
 
    // Otherwise return the number of
    // operations performed
    return ans;
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    int N = 3;
    int nums[] = { 3, 4, 12 };
    int X = 25;
 
    // Function call
    System.out.print(minimumOperations(N, X, nums));
  }
}
 
// This code is contributed by Rohit Pradhan

Python3

# Python code to implement the above approach
 
# Function to find minimum operations
def minimumOperations(N, X,nums):
 
    # Initialize answer as zero
    ans = 0
 
    # Create Max-Heap using
    # Priority-queue
    pq = []
 
    # Put all nums in the priority queue
    for i in range(N):
        pq.append(nums[i])
     
    pq.sort()
 
    # Execute the operation on num with
    # max value until nums are left
    # and X is positive
    while (len(pq)>0 and X > 0):
        if (pq[len(pq)-1]== 0):
            break
 
        # Increment the answer everytime
        ans += 1
 
        # num with maximum value
        num = pq[len(pq)-1]
 
        # Removing the num
        pq.pop()
 
        # Reduce X's value and num's
        # value as per the operation
        X -= num
        num //= 2
 
        # If the num's value is positive
        # insert back in the
        # priority queue
        if (num > 0):
            pq.append(num)
 
        pq.sort()
 
    # If X's value is positive then it
    # is impossible to make X
    # non-positive
    if (X > 0):
        return -1
 
    # Otherwise return the number of
    # operations performed
    return ans
 
# Drivers code
N = 3
nums = [ 3, 4, 12 ]
X = 25
 
# Function call
print(minimumOperations(N, X, nums))
 
# This code is contributed by shinjanpatra

C#

// C# code for the above approach
using System;
using System.Collections.Generic;
 
class GFG {
 
  // Function to find minimum operations
  public static int minimumOperations(int N, int X,
                                      int[] nums)
  {
 
    // Initialize answer as zero
    int ans = 0;
 
    // Create Max-Heap using
    // Priority-queue
    List<int> pq = new List<int>();
 
    // Put all nums in the priority queue
    for (int i = 0; i < N; i++){
      pq.Add(nums[i]);
      pq.Sort();
      pq.Reverse();
    }
 
    // Execute the operation on num with
    // max value until nums are left
    // and X is positive
    while (pq.Count != 0 && X > 0) {
      if (pq[0] == 0)
        break;
 
      // Increment the answer everytime
      ans++;
 
      // num with maximum value
      int num = pq[0];
 
      // Removing the num
      pq.RemoveAt(0);
 
      // Reduce X's value and num's
      // value as per the operation
      X -= num;
      num /= 2;
 
      // If the num's value is positive
      // insert back in the
      // priority queue
      if (num > 0){
        pq.Add(num);
        pq.Sort();
        pq.Reverse();
      }
    }
 
    // If X's value is positive then it
    // is impossible to make X
    // non-positive
    if (X > 0)
      return -1;
 
    // Otherwise return the number of
    // operations performed
    return ans;
  }
 
  // Driver Code
  public static void Main()
  {
    int N = 3;
    int[] nums = { 3, 4, 12 };
    int X = 25;
 
    // Function call
    Console.WriteLine(minimumOperations(N, X, nums));
  }
}
 
// This code is contributed by sanjoy_62.

Javascript

<script>
 
//  JavaScript code to implement the above approach
 
//  Function to find minimum operations
function minimumOperations(N, X,nums){
 
    //  Initialize answer as zero
    let ans = 0
 
    //  Create Max-Heap using
    //  Priority-queue
    let pq = []
 
    //  Put all nums in the priority queue
    for(let i=0;i<N;i++)
        pq.push(nums[i])
     
    pq.sort((a,b)=>a-b)
 
    //  Execute the operation on num with
    //  max value until nums are left
    //  && X is positive
    while (pq.length>0 && X > 0){
        if (pq[pq.length-1]== 0)
            break
 
        //  Increment the answer everytime
        ans += 1
 
        //  num with maximum value
        let num = pq[pq.length-1]
 
        //  Removing the num
        pq.pop()
 
        //  Reduce X's value && num's
        //  value as per the operation
        X -= num
        num = Math.floor(num/2)
 
        //  If the num's value is positive
        //  insert back in the
        //  priority queue
        if (num > 0)
            pq.push(num)
 
        pq.sort()
    }
 
    //  If X's value is positive then it
    //  is impossible to make X
    //  non-positive
    if (X > 0)
        return -1
 
    //  Otherwise return the number of
    //  operations performed
    return ans
}
 
//  Drivers code
let N = 3
let nums = [ 3, 4, 12 ]
let X = 25
 
//  Function call
document.write(minimumOperations(N, X, nums))
 
//  This code is contributed by shinjanpatra
 
<script>
Producción

4

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

Publicación traducida automáticamente

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