Maximice la ganancia posible vendiendo M productos de modo que la ganancia de un producto sea la cantidad de productos que quedan de ese proveedor

Dada una array arr[] que consiste en N enteros positivos, tal que arr[i] representa el número de productos que tiene el i -ésimo proveedor y un entero positivo, M , la tarea es encontrar la ganancia máxima vendiendo M productos si la ganancia de un producto en particular es igual al número de productos restantes de ese proveedor.

Ejemplos:

Entrada: arr[] = {4, 6}, M = 4
Salida: 19
Explicación:
A continuación se muestra el orden de venta del producto para obtener el máximo beneficio:
Producto 1: Vender un producto del segundo proveedor, luego la array se modifica a {4, 5} y la ganancia es 6.
Producto 2: vende un producto del segundo proveedor, luego la array se modifica a {4, 4} y la ganancia es 6 + 5 = 11.
Producto 3: vende un producto del segundo proveedor. segundo proveedor, luego la array se modifica a {4, 3} y la ganancia es 6 + 5 + 4 = 15.
Producto 4: Vender un producto del primer proveedor, luego la array se modifica a {3, 3} y la ganancia es 6 + 5 + 4 + 4 = 19.
Por tanto, la máxima ganancia que se puede obtener vendiendo 4 productos es 19.

Entrada: arr[] = {1, 2, 3}, M = 2
Salida: 5

Enfoque ingenuo: el problema dado se puede resolver vendiendo el producto a los proveedores que tienen la cantidad máxima actual de productos restantes. Entonces, la idea es iterar un ciclo M veces , y en cada iteración encontrar el valor del elemento más grande en la array , y agregar su valor a la ganancia y luego disminuir su valor en la array en 1. Después del ciclo, imprima el valor de la ganancia.

Complejidad de Tiempo: O(M * N)
Espacio Auxiliar: O(1)

Enfoque eficiente: el enfoque anterior también se puede optimizar mediante el uso de Max-Heap para realizar un seguimiento del elemento máximo en la array en tiempo O (log N) . 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 maximum profit
// by selling M number of products
void findMaximumProfit(int arr[], int M, int N)
{
     
    // Initialize a Max-Heap to keep
    // track of the maximum value
    priority_queue<int> max_heap;
 
    // Stores the maximum profit
    int maxProfit = 0;
 
    // Traverse the array and push
    // all the elements in max_heap
    for(int i = 0; i < N; i++)
        max_heap.push(arr[i]);
 
    // Iterate a loop until M > 0
    while (M > 0)
    {
         
        // Decrement the value
        // of M by 1
        M--;
 
        // Pop the maximum element
        // from the heap
        int X = max_heap.top();
        max_heap.pop();
           
        // Update the maxProfit
        maxProfit += X;
 
        // Push (X - 1) to max heap
        max_heap.push(X - 1);
    }
 
    // Print the result
    cout<<maxProfit;
}
 
// Driver Code
int main()
{
    int arr[] = { 4, 6 };
    int M = 4;
    int N = sizeof(arr) / sizeof(arr[0]);
     
    findMaximumProfit(arr, M, N);
}
 
// This code is contributed by bgangwar59

Java

// Java program for the above approach
 
import java.util.*;
 
class GFG {
 
    // Function to find the maximum profit
    // by selling M number of products
    static void findMaximumProfit(
        int[] arr, int M, int N)
    {
 
        // Initialize a Max-Heap to keep
        // track of the maximum value
        PriorityQueue<Integer> max_heap
            = new PriorityQueue<>((a, b) -> b - a);
 
        // Stores the maximum profit
        int maxProfit = 0;
 
        // Traverse the array and push
        // all the elements in max_heap
        for (int i = 0; i < N; i++)
            max_heap.add(arr[i]);
 
        // Iterate a loop until M > 0
        while (M > 0) {
 
            // Decrement the value
            // of M by 1
            M--;
 
            // Pop the maximum element
            // from the heap
            int X = max_heap.poll();
 
            // Update the maxProfit
            maxProfit += X;
 
            // Push (X - 1) to max heap
            max_heap.add(X - 1);
        }
 
        // Print the result
        System.out.println(maxProfit);
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int[] arr = { 4, 6 };
        int M = 4;
        int N = arr.length;
        findMaximumProfit(arr, M, N);
    }
}

Python3

# Python3 program for the above approach
 
# Function to find the maximum profit
# by selling M number of products
def findMaximumProfit(arr, M, N):
     
    # Initialize a Max-Heap to keep
    # track of the maximum value
    max_heap = []
 
    # Stores the maximum profit
    maxProfit = 0
 
    # Traverse the array and push
    # all the elements in max_heap
    for i in range(0, N):
        max_heap.append(arr[i])
        
    max_heap.sort()
    max_heap.reverse()
 
    # Iterate a loop until M > 0
    while (M > 0):
 
        # Decrement the value
        # of M by 1
        M -= 1
 
        # Pop the maximum element
        # from the heap
        X = max_heap[0]
        max_heap.pop(0)
 
        # Update the maxProfit
        maxProfit += X
 
        # Push (X - 1) to max heap
        max_heap.append(X - 1)
        max_heap.sort()
        max_heap.reverse()
 
    # Print the result
    print(maxProfit)
 
# Driver code
arr = [ 4, 6 ]
M = 4
N = len(arr)
   
findMaximumProfit(arr, M, N)
 
# This code is contributed by rameshtravel07

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
class GFG {
     
    // Function to find the maximum profit
    // by selling M number of products
    static void findMaximumProfit(int[] arr, int M, int N)
    {
  
        // Initialize a Max-Heap to keep
        // track of the maximum value
        List<int> max_heap = new List<int>();
  
        // Stores the maximum profit
        int maxProfit = 0;
  
        // Traverse the array and push
        // all the elements in max_heap
        for(int i = 0; i < N; i++)
            max_heap.Add(arr[i]);
            
        max_heap.Sort();
        max_heap.Reverse();
  
        // Iterate a loop until M > 0
        while (M > 0)
        {
  
            // Decrement the value
            // of M by 1
            M--;
  
            // Pop the maximum element
            // from the heap
            int X = max_heap[0];
            max_heap.RemoveAt(0);
  
            // Update the maxProfit
            maxProfit += X;
  
            // Push (X - 1) to max heap
            max_heap.Add(X - 1);
            max_heap.Sort();
            max_heap.Reverse();
        }
  
        // Print the result
        Console.Write(maxProfit);
    }
     
  static void Main() {
    int[] arr = { 4, 6 };
    int M = 4;
    int N = arr.Length;
       
    findMaximumProfit(arr, M, N);
  }
}
 
// This code is contributed by mukesh07.

Javascript

<script>
    // Javascript program for the above approach
     
    // Function to find the maximum profit
    // by selling M number of products
    function findMaximumProfit(arr, M, N)
    {
 
        // Initialize a Max-Heap to keep
        // track of the maximum value
        let max_heap = [];
 
        // Stores the maximum profit
        let maxProfit = 0;
 
        // Traverse the array and push
        // all the elements in max_heap
        for(let i = 0; i < N; i++)
            max_heap.push(arr[i]);
           
        max_heap.sort(function(a, b){return a - b});
        max_heap.reverse();
 
        // Iterate a loop until M > 0
        while (M > 0)
        {
 
            // Decrement the value
            // of M by 1
            M--;
 
            // Pop the maximum element
            // from the heap
            let X = max_heap[0];
            max_heap.shift();
 
            // Update the maxProfit
            maxProfit += X;
 
            // Push (X - 1) to max heap
            max_heap.push(X - 1);
            max_heap.sort(function(a, b){return a - b});
            max_heap.reverse();
        }
 
        // Print the result
        document.write(maxProfit);
    }
     
    let arr = [ 4, 6 ];
    let M = 4;
    let N = arr.length;
      
    findMaximumProfit(arr, M, N);
  
 // This code is contributed by divyeshrabadiya07.
</script>
Producción: 

19

 

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

Publicación traducida automáticamente

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