Calculadora de propinas máximas | conjunto 2

Rahul y Ankit son los dos únicos camareros del Royal Restaurant. Hoy, el restaurante recibió N pedidos. La cantidad de propinas puede diferir cuando las manejan diferentes camareros y se dan como arrays A[] y B[] , de modo que si Rahul toma la i -ésima orden, recibirá una propina de A[i] rupias, y si Ankit toma esta orden, el La propina sería B[i] rupias. Para maximizar el valor total de la propina, decidieron distribuir el pedido entre ellos. Un pedido será manejado por una sola persona . Además, debido a limitaciones de tiempo, Rahul no puede tomar más de Xpedidos y Ankit no puede aceptar más de Y pedidos. Se garantiza que X + Y es mayor o igual que N , lo que significa que todos los pedidos pueden ser manejados por Rahul o Ankit. La tarea es averiguar la cantidad máxima posible de dinero total de propinas después de procesar todos los pedidos.

Ejemplos:

Entrada: N = 5, X = 3, Y = 3, A[] = {1, 2, 3, 4, 5}, B[] = {5, 4, 3, 2, 1}
Salida: 21
Explicación:
Paso 1: 5 está incluido en la array de Ankit 
Paso 2: 4 está incluido en la array de Ankit 
Paso 3: Como ambos tienen el mismo valor 3, elija cualquiera de ellos 
Paso 4: 4 está incluido en la array de Rahul 
Paso 5: 5 está incluido de la array de Rahul 
Por lo tanto, la cantidad máxima posible de dinero total de propinas suma 21.

Entrada: N = 7, X = 3, Y = 4, A[] = {8, 7, 15, 19, 16, 16, 18}, B[] = {1, 7, 15, 11, 12, 31 , 9} 
Salida: 110

Enfoque ingenuo: El enfoque ingenuo para resolver este artículo se analiza en el artículo anterior.

Enfoque eficiente: la idea es utilizar la técnica codiciosa para resolver el problema. Ordena los N pedidos en orden decreciente según la diferencia entre la propina de Rahul y la propina de Ankit. Luego, recorra todas las órdenes y tome la punta máxima de la i -ésima orden si es posible. Siga los pasos a continuación para resolver el problema:

  • Inicialice ans como 0 para almacenar la máxima propina posible.
  • Cree un vector de par de enteros, V de tamaño N tal que el primer y segundo elemento de V[i] almacene la punta del i -ésimo orden de Rahul y Ankit respectivamente.
  • Ordene el vector , V en orden decreciente sobre la base de la diferencia entre las puntas.
  • Recorrer el vector , V usando la variable i
    • Si el valor de Y es 0 O la condición V[i].primero ≥ V[i].segundo se cumple, entonces sume el valor de V[i].primero a ans y disminuya X en 1 .
    • De lo contrario, agregue el valor de V[i].segundo a ans y disminuya Y en 1 .
  • Después de completar los pasos anteriores, imprima el valor de ans como resultado.

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;
 
// Utility Compare function
// for sorting the array
bool compare(pair<int, int> p1, pair<int, int> p2)
{
    return abs(p1.first - p1.second)
           > abs(p2.first - p2.second);
}
 
// Function to find the maximum possible amount of total
// tip money after processing all the orders
void maxTip(int A[], int B[], int X, int Y, int N)
{
    // Store all the N orders
    vector<pair<int, int> > tips(N);
 
    // Traverse all the orders and add them
    // to the vector, V
    for (int i = 0; i < N; i++) {
        tips[i].first = A[i];
        tips[i].second = B[i];
    }
 
    // Sort the vector in decreasing
      // order of absolute
    // difference of the tips value
    sort(tips.begin(), tips.end(), compare);
 
    // Store the required result
    int ans = 0;
 
    // Traverse all the orders
    for (int i = 0; i < N; i++) {
 
        // Check if Y is 0 or Rahul's tip value
        // is greater than or equal to that of Ankit
        if (Y == 0
            || (X > 0 && tips[i].first >= tips[i].second)) {
 
            // Update the overall result and
            // decrement X by 1
            ans += tips[i].first;
            X--;
        }
 
        else {
 
            // Update the overall result and
            // decrement Y by 1
            ans += tips[i].second;
            Y--;
        }
    }
 
    // Print the result
    cout << ans;
}
 
// Driver Code
int main()
{
    // Given input
    int N = 5, X = 3, Y = 3;
    int A[] = { 1, 2, 3, 4, 5 };
    int B[] = { 5, 4, 3, 2, 1 };
 
    // Function Call
    maxTip(A, B, X, Y, N);
 
    return 0;
}

Javascript

<script>
 
// JavaScript program for the above approach
 
 
// Utility Compare function
// for sorting the array
function compare(p1, p2)
{
    return Math.abs(p2[0] - p2[1]) - Math.abs(p1[0] - p1[1]);
}
 
// Function to find the maximum possible amount of total
// tip money after processing all the orders
function maxTip(A, B, X, Y, N)
{
    // Store all the N orders
    let tips = new Array(N);
 
    // Traverse all the orders and add them
    // to the vector, V
    for (let i = 0; i < N; i++) {
        tips[i] = new Array();
        tips[i][0] = A[i];
        tips[i][1] = B[i];
    }
 
    // Sort the vector in decreasing
    // order of absolute
    // difference of the tips value
    tips.sort(compare);
 
    // Store the required result
    let ans = 0;
 
    // Traverse all the orders
    for (let i = 0; i < N; i++) {
 
        // Check if Y is 0 or Rahul's tip value
        // is greater than or equal to that of Ankit
        if (Y == 0
            || (X > 0 && tips[i][0] >= tips[i][1])) {
 
            // Update the overall result and
            // decrement X by 1
            ans += tips[i][0];
            X--;
        }
 
        else {
 
            // Update the overall result and
            // decrement Y by 1
            ans += tips[i][1];
            Y--;
        }
    }
 
    // Print the result
    document.write(ans,"</br>");
}
 
// Driver Code
 
// Given input
let N = 7, X = 3, Y = 4;
let A = [8, 7, 15, 19, 16, 16, 18];
let B = [1, 7, 15, 11, 12, 31, 9];
 
 
// Function Call
maxTip(A, B, X, Y, N);
 
// This code is contributed by shinjanpatra.
</script>
Producción

21

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

Publicación traducida automáticamente

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