Maximizar el recuento de personas que reciben un chocolate

Dadas dos arrays A[] , que consisten en N enteros, y B[] , que consisten en valores de sabor de M chocolates y un entero X , la tarea es encontrar el número máximo de personas que pueden recibir un chocolate con la condición de que uno persona puede tener solo un chocolate y con valor de sabor en el rango [A[i] – X, A[i] + X]
Nota: Una vez que se le da un chocolate a una persona, no se le puede dar a ninguna otra persona.

Ejemplos:

Entrada: A[] = {90, 49, 20, 39, 60}, B[] = {14, 24, 82}, X = 15
Salida: 3
Explicación: 
la primera persona puede elegir el tercer chocolate como el valor del El tercer chocolate ( = 82 ) se encuentra en el rango [75 ( = 90 – 15 ), 105 ( = 90 + 15)]. 
La segunda persona no puede elegir ningún chocolate porque no hay chocolate con un valor en el rango [34 ( = 49 – 15 ), 64 ( = 49 + 15). 
La tercera persona puede elegir el primer chocolate ya que el valor del primer chocolate se encuentra en el rango [5 (= 20 – 15), 35 (= 20 – 15)]. 
La cuarta persona puede elegir el segundo chocolate porque el valor del segundo chocolate se encuentra en el rango [24 (= 39 – 15) y 54 (= 39 – 15)]. 
La quinta persona no puede elegir ningún chocolate porque no hay chocolate con un valor en el rango [45 (= 60 – 15), 75 (= 60 – 15)]. 
Por lo tanto, el número total de personas que reciben un chocolate es 3, que es el máximo posible.

Entrada: A[] = {2, 4, 6, 40, 50}, B[] = {38, 36}, X=13
Salida: 2

Enfoque: este problema se puede resolver usando la técnica codiciosa/a> y la búsqueda . La observación clave aquí es que para cualquier i -ésima persona , asigne el chocolate con el menor valor posible que se encuentre en el rango, si es posible. De lo contrario, excluya a esa persona del resultado. Siga los pasos a continuación:

  • Ordene las arrays dadas A[] y B[] en orden no decreciente.
  • Inicialice un conjunto múltiple para almacenar los elementos de la array B[] .
  • Inicialice una variable count = 0 para almacenar el recuento de personas que reciben un chocolate.
  • Recorra la array A[] y encuentre el valor de chocolate más pequeño posible que se pueda asignar a cada i -ésima persona mediante la búsqueda binaria o lower_bound() . Compruebe si ese valor se encuentra en el rango [a i – X, a i + X] o no.
  • Si se determina que es cierto, incremente el conteo y elimine el valor de este chocolate del conjunto múltiple .
  • Después de completar los pasos anteriores, imprima el valor de conteo 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;
 
// Function to count the maximum number
// of persons receiving a chocolate
int countMaxPersons(int* A, int n, int* B,
                    int m, int x)
{
 
    // Initialize count as 0
    int count = 0;
 
    // Sort the given arrays
    sort(A, A + n);
    sort(B, B + m);
 
    // Initialize a multiset
    multiset<int> s;
 
    // Insert B[] array values into
    // the multiset
    for (int i = 0; i < m; i++)
        s.insert(B[i]);
 
    // Traverse elements in array A[]
    for (int i = 0; i < n; i++) {
        int val = A[i] - x;
 
        // Search for the lowest value in B[]
        auto it = s.lower_bound(val);
 
        // If found, increment count,
        // and delete from set
        if (it != s.end()
            && *it <= A[i] + x) {
            count++;
            s.erase(it);
        }
    }
 
    // Return the number of people
    return count;
}
 
// Driver Code
int main()
{
    int A[] = { 90, 49, 20, 39, 49 };
    int B[] = { 14, 24, 82 };
    int X = 15;
    int N = sizeof(A) / sizeof(A[0]);
    int M = sizeof(B) / sizeof(B[0]);
 
    // Function Call
    cout << countMaxPersons(A, N, B, M, X);
}

Python3

# Python3 program for the above approach
from bisect import bisect_left
 
# Function to count the maximum number
# of persons receiving a chocolate
def countMaxPersons(A, n, B, m, x):
 
    # Initialize count as 0
    count = 0
 
    # Sort the given arrays
    A = sorted(A)
    B = sorted(B)
 
    # Initialize a multiset
    s = []
 
    # Insert B[] array values into
    # the multiset
    for i in range(m):
        s.append(B[i])
 
    # Traverse elements in array A[]
    for i in range(n):
        val = A[i] - x
 
        # Search for the lowest value in B[]
        it = bisect_left(s,val)
 
        # If found, increment count,
        # and delete from set
        if (it != len(s) and it <= A[i] + x):
            count += 1
            del s[it]
 
    # Return the number of people
    return count
 
# Driver Code
if __name__ == '__main__':
 
    A = [90, 49, 20, 39, 49]
    B = [14, 24, 82]
    X = 15
    N = len(A)
    M = len(B)
 
    # Function Call
    print(countMaxPersons(A, N, B, M, X))
 
    # This code is contributed by mohit kumar 29
Producción: 

3

 

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

Publicación traducida automáticamente

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