Maximice los números que se pueden agrupar según las condiciones dadas

Dada una array 2D A[][] de tamaño N x 2 donde:

  • Cada elemento se encuentra entre [1, N].
  • A[i][0] significa que debe haber como máximo A[i][0] elementos estrictamente menores que i+1 y como máximo A[i][1] elementos estrictamente mayores que i+1.

La tarea es encontrar el máximo número de elementos que pueden unirse cumpliendo la condición anterior.

Ejemplos:

Entrada: N = 3, A[][] = {{1, 2}, {2, 1}, {1, 1]}
Salida: 2
Explicación: Si 1, 2, 3 se juntan, entonces hay 0 (como máximo 1) elemento menor que 1 y 2 (como máximo 2) son mayores. 
1 (como máximo 2) elemento menor que 2 y 1 (como máximo 1) mayor que 2. 
Para 3 hay 2 elementos menores que 3 pero según la condición puede haber como máximo 1 elemento menor que 3. 
Por lo tanto, no puede incluir 3. Por lo tanto, se pueden seleccionar un máximo de 2 elementos juntos.  

Entrada: N = 5, A[][] = {{2, 3}, {4, 2}, {3, 1}, {3, 1}, {1, 1}};
Salida: 4

 

Enfoque ingenuo : la idea se basa en el concepto de que se puede mantener un mínimo de 1 elemento en un conjunto y, como máximo, todos los elementos se pueden mantener juntos, es decir, N

  • Inicialmente, para el valor de K donde 1 <= K <= N , compruebe si se pueden agrupar K elementos respetando las condiciones.
  • Seleccione K elementos de N elementos y verifique la siguiente condición para todos los K de 1 a N.
    • Compruebe para cada candidato i de 1 a N :
      • Si C candidatos ya pertenecen al conjunto de K elementos, entonces para que el i-ésimo elemento pertenezca a un conjunto de K números, i debe tener exactamente C elementos más pequeños y KC-1 elementos mayores que i .
    • De esta forma, cuente los candidatos válidos y verifique si es posible mantener los K elementos juntos en un conjunto.
  • Al final, la máxima K es la respuesta.

Complejidad de Tiempo: O(N 2 )
Espacio Auxiliar: O(1)

Enfoque eficiente: el mejor enfoque es resolver usando la búsqueda binaria .

  • En lugar de verificar todos los valores posibles de K , use la búsqueda binaria allí.
  • Como si fuera posible mantener juntos K elementos, esto significa que también es posible mantener juntos cualquier valor más bajo de K elementos.
  • Por lo tanto, verifique los valores más altos y si no es posible mantener K elementos juntos, significa que los valores más altos de K no se pueden agrupar.
  • Cuando tanto el valor más bajo como el más alto se convierten en esa es la respuesta.

 A continuación se muestra la implementación del enfoque mencionado anteriormente:

C++14

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to check if it is possible
// to keep k elements together
bool isPossible(vector<vector<int> >& a,
                int n, int k)
{
    // Initially the set is empty, so
    // candidates present is 0
    int candidatePresent = 0;
 
    // Loop through all the candidates
    for (int i = 0; i < n; i++) {
 
        // For i to be a part of the set
        // i's condition must allow to keep
        // Atleast candidatePresent number of
 
        // Elements smaller than i
        // And k-candidatePresent-1
        // Number of elements larger than i
 
        // If so then add i
        // To the set of k numbers
        if (a[i][0] >= candidatePresent
            && a[i][1] >= k - candidatePresent
                              - 1)
            candidatePresent++;
    }
 
    // If possible to keep at least k
    // elements together return true
    if (candidatePresent >= k)
        return true;
 
    // Else return false
    return false;
}
 
int maxElementsinSet(vector<vector<int> >& a,
                     int n)
{
    int left = 1, right = n;
    int ans = 1;
 
    while (left <= right) {
        int mid = (left + right) / 2;
 
        // If it is possible to keep mid
        // elements together them mid
        // is a possible answer and also
        // check for higher values of mid
        if (isPossible(a, n, mid)) {
            ans = mid;
            left = mid + 1;
        }
 
        // Else check for lower values of mid
        else
            right = mid - 1;
    }
 
    return ans;
}
 
// Driver Code
int main()
{
    int N = 5;
    vector<vector<int> > A = {
        { 2, 3 }, { 4, 2 }, { 3, 1 }, { 3, 1 }, { 1, 1 }
    };
 
    cout << maxElementsinSet(A, N);
    return 0;
}

Java

// Java code to implement the approach
import java.util.*;
public class GFG {
 
  // Function to check if it is possible
  // to keep k elements together
  static boolean isPossible(int a[][], int n, int k)
  {
 
    // Initially the set is empty, so
    // candidates present is 0
    int candidatePresent = 0;
 
    // Loop through all the candidates
    for (int i = 0; i < n; i++) {
 
      // For i to be a part of the set
      // i's condition must allow to keep
      // Atleast candidatePresent number of
 
      // Elements smaller than i
      // And k-candidatePresent-1
      // Number of elements larger than i
 
      // If so then add i
      // To the set of k numbers
      if (a[i][0] >= candidatePresent
          && a[i][1] >= k - candidatePresent - 1)
        candidatePresent++;
    }
 
    // If possible to keep at least k
    // elements together return true
    if (candidatePresent >= k)
      return true;
 
    // Else return false
    return false;
  }
 
  static int maxElementsinSet(int a[][], int n)
  {
    int left = 1, right = n;
    int ans = 1;
 
    while (left <= right) {
      int mid = (left + right) / 2;
 
      // If it is possible to keep mid
      // elements together them mid
      // is a possible answer and also
      // check for higher values of mid
      if (isPossible(a, n, mid) == true) {
        ans = mid;
        left = mid + 1;
      }
 
      // Else check for lower values of mid
      else
        right = mid - 1;
    }
 
    return ans;
  }
 
  // Driver Code
  public static void main(String arg[])
  {
    int N = 5;
    int A[][] = {
      { 2, 3 }, { 4, 2 }, { 3, 1 }, { 3, 1 }, { 1, 1 }
    };
 
    System.out.println(maxElementsinSet(A, N));
  }
}
 
// This code is contributed by Samim Hossain Mondal.

Python

# Python code to implement the approach
 
# Function to check if it is possible
# to keep k elements together
def isPossible(a, n, k):
 
    # Initially the set is empty, so
    # candidates present is 0
    candidatePresent = 0
 
    # Loop through all the candidates
    for i in range(n):
 
        # For i to be a part of the set
        # i's condition must allow to keep
        # Atleast candidatePresent number of
 
        # Elements smaller than i
        # And k-candidatePresent-1
        # Number of elements larger than i
 
        # If so then add i
        # To the set of k numbers
        if (a[i][0] >= candidatePresent
            and a[i][1] >= k - candidatePresent
                              - 1):
            candidatePresent += 1
     
 
    # If possible to keep at least k
    # elements together return true
    if (candidatePresent >= k):
        return 1
 
    # Else return false
    return 0
 
def maxElementsinSet(a, n):
    left = 1
    right = n
    ans = 1
 
    while (left <= right):
        mid = (left + right) / 2
 
        # If it is possible to keep mid
        # elements together them mid
        # is a possible answer and also
        # check for higher values of mid
        if (isPossible(a, n, mid)):
            ans = mid
            left = mid + 1
 
        # Else check for lower values of mid
        else:
            right = mid - 1
 
    print(ans)
 
# Driver Code
if __name__ == "__main__":
   
    N = 5;
    A = [[ 2, 3 ], [ 4, 2 ], [ 3, 1 ], [ 3, 1 ], [ 1, 1 ]]
 
    maxElementsinSet(A, N)
     
    # This code is contributed by hrithikgarg03188.

C#

// C# code to implement the approach
using System;
 
public class GFG {
 
  // Function to check if it is possible
  // to keep k elements together
  static bool isPossible(int[, ] a, int n, int k)
  {
 
    // Initially the set is empty, so
    // candidates present is 0
    int candidatePresent = 0;
 
    // Loop through all the candidates
    for (int i = 0; i < n; i++) {
 
      // For i to be a part of the set
      // i's condition must allow to keep
      // Atleast candidatePresent number of
 
      // Elements smaller than i
      // And k-candidatePresent-1
      // Number of elements larger than i
 
      // If so then add i
      // To the set of k numbers
      if (a[i, 0] >= candidatePresent
          && a[i, 1] >= k - candidatePresent - 1)
        candidatePresent++;
    }
 
    // If possible to keep at least k
    // elements together return true
    if (candidatePresent >= k)
      return true;
 
    // Else return false
    return false;
  }
 
  static int maxElementsinSet(int[, ] a, int n)
  {
    int left = 1, right = n;
    int ans = 1;
 
    while (left <= right) {
      int mid = (left + right) / 2;
 
      // If it is possible to keep mid
      // elements together them mid
      // is a possible answer and also
      // check for higher values of mid
      if (isPossible(a, n, mid) == true) {
        ans = mid;
        left = mid + 1;
      }
 
      // Else check for lower values of mid
      else
        right = mid - 1;
    }
 
    return ans;
  }
 
  // Driver Code
  public static void Main(String[] arg)
  {
    int N = 5;
    int[, ] A = {
      { 2, 3 }, { 4, 2 }, { 3, 1 }, { 3, 1 }, { 1, 1 }
    };
 
    Console.WriteLine(maxElementsinSet(A, N));
  }
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
    // JavaScript code to implement the approach
 
    // Function to check if it is possible
    // to keep k elements together
    const isPossible = (a, n, k) => {
     
        // Initially the set is empty, so
        // candidates present is 0
        let candidatePresent = 0;
 
        // Loop through all the candidates
        for (let i = 0; i < n; i++) {
 
            // For i to be a part of the set
            // i's condition must allow to keep
            // Atleast candidatePresent number of
 
            // Elements smaller than i
            // And k-candidatePresent-1
            // Number of elements larger than i
 
            // If so then add i
            // To the set of k numbers
            if (a[i][0] >= candidatePresent
                && a[i][1] >= k - candidatePresent
                - 1)
                candidatePresent++;
        }
 
        // If possible to keep at least k
        // elements together return true
        if (candidatePresent >= k)
            return true;
 
        // Else return false
        return false;
    }
 
    const maxElementsinSet = (a, n) => {
        let left = 1, right = n;
        let ans = 1;
 
        while (left <= right) {
            let mid = parseInt((left + right) / 2);
 
            // If it is possible to keep mid
            // elements together them mid
            // is a possible answer and also
            // check for higher values of mid
            if (isPossible(a, n, mid)) {
                ans = mid;
                left = mid + 1;
            }
 
            // Else check for lower values of mid
            else
                right = mid - 1;
        }
 
        return ans;
    }
 
    // Driver Code
    let N = 5;
    let A = [
        [2, 3], [4, 2], [3, 1], [3, 1], [1, 1]
    ];
 
    document.write(maxElementsinSet(A, N));
 
// This code is contributed by rakeshsahni
 
</script>
Producción

4

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

Publicación traducida automáticamente

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