Número máximo de equipos de tamaño K posible con cada jugador de un país diferente

Dada una array arr[] que consta de N enteros positivos y un entero positivo K tal que hay N países, cada país tiene arr[i] jugadores, la tarea es encontrar el número máximo de equipos que se pueden formar formando equipos de talla K de manera que cada jugador del equipo sea de un país diferente.

Ejemplos:

Entrada: N = 4, K = 3, arr[] = {4, 3, 5, 3}
Salida: 5
Explicación:
Considere que los países se llaman A, B, C y D. Las formas posibles de formar los equipos son { A, B, C}, {A, C, D}, {A, B, C}, {B, C, D}, {A, C, D} tales que en cada conjunto no haya más de 1 persona de un país

Por lo tanto, el número total de equipos formados es 5.

Entrada: N = 3, K = 2, arr[] = {2, 3, 4}
Salida: 4
Explicación: 
Considere que los países se llaman A, B, C y D. Las formas posibles de formar los equipos son {B, C}, {B, C}, {A, C}, ({A, B} o {A, C} o {B, C}) de manera que en cada conjunto no haya más de 1 persona de un país.

Por lo tanto, el número total de equipos formados es 4.

Planteamiento: El problema dado se puede resolver utilizando la Búsqueda Binaria , la idea es realizar la Búsqueda Binaria sobre la cantidad de equipos que se pueden formar. Sea esta  variable T. Para cada valor de  T , compruebe si es posible formar  T equipos a partir de la lista dada de jugadores de cada país. Se pueden formar T equipos si la suma del mínimo de arr[i] o T para todos los i sobre el rango [0, N – 1] es mayor que igual a T*K . Siga los pasos a continuación para resolver este problema:

  • Defina una función , digamos isPossible(arr, mid, K) para comprobar si se puede formar o no un número medio de equipos.
    • Inicialice la variable sum como 0 para almacenar la suma de los elementos de la array .
    • Itere sobre un rango [0, N] y realice las siguientes tareas:
      • Agregue el valor de un mínimo de mid o arr[i] a la variable sum.
    • Si la suma es mayor que igual a mid*K , devuelve true . De lo contrario, devuelve falso .
  • Inicialice las variables, digamos lb y ub como 0 y 1e9 como el límite inferior y superior del número de equipos que se pueden formar.
  • Iterar durante un ciclo while hasta que lb sea menor que ub y realizar los siguientes pasos:
    • Inicialice la variable, digamos mid como el promedio de ub y lb.
    • Llame a la función isPossible(arr, mid, K) y si la función devuelve true , verifique la parte superior del rango. De lo contrario, verifique la parte inferior del rango.
  • Después de realizar los pasos anteriores, imprima el valor de mid 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 find if T number of teams
// can be formed or not
bool is_possible(vector<int>& teams,
                 int T, int k)
{
    // Store the sum of array elements
    int sum = 0;
 
    // Traverse the array teams[]
    for (int i = 0; i < teams.size(); i++) {
        sum += min(T, teams[i]);
    }
 
    // Required Condition
    return (sum >= (T * k));
}
 
// Function to find the maximum number
// of teams possible
int countOfTeams(vector<int>& teams_list,
                 int N, int K)
{
    // Lower and Upper part of the range
    int lb = 0, ub = 1e9;
 
    // Perform the Binary Search
    while (lb <= ub) {
 
        // Find the value of mid
        int mid = lb + (ub - lb) / 2;
 
        // Perform the Binary Search
        if (is_possible(teams_list, mid, K)) {
 
            if (!is_possible(
                    teams_list, mid + 1, K)) {
                return mid;
            }
 
            // Otherwise, update the
            // search range
            else {
                lb = mid + 1;
            }
        }
 
        // Otherwise, update the
        // search range
        else {
            ub = mid - 1;
        }
    }
    return 0;
}
 
// Driver Code
int main()
{
    vector<int> arr = { 2, 3, 4 };
    int K = 2;
    int N = arr.size();
    cout << countOfTeams(arr, N, K);
 
    return 0;
}

Java

// Java program for the above approach
class GFG {
 
    // Function to find if T number of teams
    // can be formed or not
    public static boolean is_possible(int[] teams, int T, int k)
    {
       
        // Store the sum of array elements
        int sum = 0;
 
        // Traverse the array teams[]
        for (int i = 0; i < teams.length; i++) {
            sum += Math.min(T, teams[i]);
        }
 
        // Required Condition
        return (sum >= (T * k));
    }
 
    // Function to find the maximum number
    // of teams possible
    public static int countOfTeams(int[] teams_list, int N, int K)
    {
       
        // Lower and Upper part of the range
        int lb = 0;
        double ub = 1e9;
 
        // Perform the Binary Search
        while (lb <= ub) {
 
            // Find the value of mid
            int mid = lb + (int) (ub - lb) / 2;
 
            // Perform the Binary Search
            if (is_possible(teams_list, mid, K)) {
 
                if (!is_possible(teams_list, mid + 1, K)) {
                    return mid;
                }
 
                // Otherwise, update the
                // search range
                else {
                    lb = mid + 1;
                }
            }
 
            // Otherwise, update the
            // search range
            else {
                ub = mid - 1;
            }
        }
        return 0;
    }
 
    // Driver Code
    public static void main(String args[]) {
        int[] arr = { 2, 3, 4 };
        int K = 2;
        int N = arr.length;
        System.out.println(countOfTeams(arr, N, K));
 
    }
}
 
// This code is contributed by _saurabh_jaiswal.

Python3

# Python 3 program for the above approach
 
# Function to find if T number of teams
# can be formed or not
def is_possible(teams, T, k):
    # Store the sum of array elements
    sum = 0
 
    # Traverse the array teams[]
    for i in range(len(teams)):
        sum += min(T, teams[i])
 
    # Required Condition
    return (sum >= (T * k))
 
# Function to find the maximum number
# of teams possible
 
def countOfTeams(teams_list, N, K):
    # Lower and Upper part of the range
    lb = 0
    ub = 1000000000
 
    # Perform the Binary Search
    while (lb <= ub):
 
        # Find the value of mid
        mid = lb + (ub - lb) // 2
 
        # Perform the Binary Search
        if (is_possible(teams_list, mid, K)):
            if (is_possible(teams_list, mid + 1, K)==False):
                return mid
 
            # Otherwise, update the
            # search range
            else:
                lb = mid + 1
 
        # Otherwise, update the
        # search range
        else:
            ub = mid - 1
    return 0
 
# Driver Code
if __name__ == '__main__':
    arr = [2, 3, 4]
    K = 2
    N = len(arr)
    print(countOfTeams(arr, N, K))
     
    # This code is contributed by ipg2016107.

C#

// C# program for the above approach
using System;
 
class GFG{
 
// Function to find if T number of teams
// can be formed or not
public static bool is_possible(int[] teams,
                               int T, int k)
{
     
    // Store the sum of array elements
    int sum = 0;
 
    // Traverse the array teams[]
    for(int i = 0; i < teams.Length; i++)
    {
        sum += Math.Min(T, teams[i]);
    }
 
    // Required Condition
    return (sum >= (T * k));
}
 
// Function to find the maximum number
// of teams possible
public static int countOfTeams(int[] teams_list,
                               int N, int K)
{
     
    // Lower and Upper part of the range
    int lb = 0;
    double ub = 1e9;
 
    // Perform the Binary Search
    while (lb <= ub)
    {
         
        // Find the value of mid
        int mid = lb + (int) (ub - lb) / 2;
 
        // Perform the Binary Search
        if (is_possible(teams_list, mid, K))
        {
            if (!is_possible(teams_list, mid + 1, K))
            {
                return mid;
            }
 
            // Otherwise, update the
            // search range
            else
            {
                lb = mid + 1;
            }
        }
 
        // Otherwise, update the
        // search range
        else
        {
            ub = mid - 1;
        }
    }
    return 0;
}
 
// Driver Code
public static void Main(String[] args)
{
    int[] arr = { 2, 3, 4 };
    int K = 2;
    int N = arr.Length;
     
    Console.WriteLine(countOfTeams(arr, N, K));
}
}
 
// This code is contributed by code_hunt

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function to find if T number of teams
// can be formed or not
function is_possible(teams, T, k) {
  // Store the sum of array elements
  let sum = 0;
 
  // Traverse the array teams[]
  for (let i = 0; i < teams.length; i++) {
    sum += Math.min(T, teams[i]);
  }
 
  // Required Condition
  return sum >= T * k;
}
 
// Function to find the maximum number
// of teams possible
function countOfTeams(teams_list, N, K) {
  // Lower and Upper part of the range
  let lb = 0,
    ub = 1e9;
 
  // Perform the Binary Search
  while (lb <= ub) {
    // Find the value of mid
    let mid = Math.floor(lb + (ub - lb) / 2);
 
    // Perform the Binary Search
    if (is_possible(teams_list, mid, K)) {
      if (!is_possible(teams_list, mid + 1, K)) {
        return mid;
      }
 
      // Otherwise, update the
      // search range
      else {
        lb = mid + 1;
      }
    }
 
    // Otherwise, update the
    // search range
    else {
      ub = mid - 1;
    }
  }
  return 0;
}
 
// Driver Code
 
let arr = [2, 3, 4];
let K = 2;
let N = arr.length;
document.write(countOfTeams(arr, N, K));
 
</script>
Producción: 

4

 

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

Publicación traducida automáticamente

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