Número mínimo de índices de array que se deben seleccionar para que la suma de un conjunto sea mayor que la de otro

Dadas dos arrays arr[] y brr[] de tamaño N y un entero K . Considere dos conjuntos A , que contiene K inicialmente, y B , inicialmente vacío. En cada operación, se requiere seleccionar un índice. Para cada índice seleccionado, digamos i , arr[i] y brr[i] se agregan a B . Para cada índice no seleccionado, arr[i] se agrega a A. La tarea es encontrar el número mínimo de índices necesarios para seleccionar para que la suma de B sea mayor que la suma de A.. Si no es posible hacerlo, imprima -1.

Ejemplos:

Entrada: arr[] = {3, 2, 5, 6}, brr[] = {4, 4, 2, 3}, K = 12 Salida: 3 4 3 1 Explicación: Se seleccionan los índices 2   
, 3
y
0 . Suma de B = arr[0] + brr[0] + arr[2] + brr[2] + arr[3] + brr[3] = 3 + 4 + 5 + 2 + 6 + 3 = 23. Suma de A = K + arr[1] = 12 + 2 = 14.

Entrada: arr[] = {3, 2, 5, 6}, brr[] = {4, 4, 2, 3}, K = 34
Salida: -1

Enfoque: La idea es utilizar un Enfoque codicioso . Siga los pasos a continuación para resolver el problema:

  • Inicialice un vector de par, B[] para realizar un seguimiento de los índices.
  • Inicialice una variable, A con K para almacenar el valor del conjunto A.
  • Recorra la array arr[] usando la variable i ,
    • Agregue el valor arr[i] a A , si no se eligió el índice.
    • Inserta {brr[i] + 2 * arr[i], i} como un par en el vector B .
  • Ordena el vector B en orden decreciente.
  • Inicializar un vector, ans para almacenar los índices que se elijan.
  • Ejecute un bucle while y siga eligiendo los índices hasta que el valor de A sea mayor que el de B.
  • Si se eligen todos los índices pero el valor de B sigue siendo menor que A , imprima «-1» .
  • De lo contrario, imprima el tamaño del vector y como el número mínimo de movimientos.
  • Recorra el vector , ans , e imprima los índices elegidos.

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 print the minimum number
// of indices required to be selected
void numberOfIndexes(int arr[], int brr[],
                     int N, int K)
{
    // Declare vector to keep track of indexes
    vector<pair<int, int> > B;
 
    // Set A contains K
    int A = K;
 
    // Traverse the array
    for (int i = 0; i < N; i++) {
 
        // Adding value that set A can
        // get if no index was chosen
        A += arr[i];
 
        // Insert as B's value
        B.push_back({ brr[i] + 2 * arr[i], i });
    }
 
    // Sort the vector
    sort(B.begin(), B.end());
 
    // Reverse the vector
    reverse(B.begin(), B.end());
 
    int tot = 0, idx = 0;
 
    // Stores chosen indexes
    vector<int> ans;
 
    // Keep on choosing more indices until
    // B's value is bigger than A or stop
    // incase all the indexes is chosen
    while (A >= tot && idx < B.size()) {
 
        // Update tot
        tot += B[idx].first;
 
        // Update ans
        ans.push_back(B[idx].second);
 
        // Increment idx
        idx++;
    }
 
    // If all indices are selected and
    // sum of B is less than sum of A
    if (tot <= A) {
        cout << -1 << endl;
        return;
    }
 
    // Print the minimum number of indices
    cout << ans.size() << endl;
 
    // Print chosen indices
    for (auto c : ans)
        cout << c + 1 << " ";
}
 
// Driver Code
int main()
{
    // Given arrays
    int arr[] = { 3, 2, 5, 6 };
    int brr[] = { 4, 4, 2, 3 };
 
    // Size of the array
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Given value of K
    int K = 12;
 
    // Function Call
    numberOfIndexes(arr, brr, N, K);
 
    return 0;
}

Python3

# Python 3 program for the above approach
 
# Function to print the minimum number
# of indices required to be selected
def numberOfIndexes(arr, brr, N, K):
   
    # Declare vector to keep track of indexes
    B = []
 
    # Set A contains K
    A = K
 
    # Traverse the array
    for i in range(N):
       
        # Adding value that set A can
        # get if no index was chosen
        A += arr[i]
 
        # Insert as B's value
        B.append([brr[i] + 2 * arr[i], i])
 
    # Sort the vector
    B.sort()
 
    # Reverse the vector
    B = B[::-1]
    tot = 0
    idx = 0
 
    # Stores chosen indexes
    ans = []
 
    # Keep on choosing more indices until
    # B's value is bigger than A or stop
    # incase all the indexes is chosen
    while (A >= tot and idx < len(B)):
       
        # Update tot
        tot += B[idx][0]
 
        # Update ans
        ans.append(B[idx][1])
 
        # Increment idx
        idx += 1
 
    # If all indices are selected and
    # sum of B is less than sum of A
    if (tot <= A):
        print(-1)
        return
 
    # Print the minimum number of indices
    print(len(ans))
 
    # Print chosen indices
    for c in ans:
        print(c + 1,end = " ")
 
# Driver Code
if __name__ == '__main__':
   
    # Given arrays
    arr = [3, 2, 5, 6]
    brr = [4, 4, 2, 3]
 
    # Size of the array
    N = len(arr)
 
    # Given value of K
    K = 12
 
    # Function Call
    numberOfIndexes(arr, brr, N, K)
     
    # This code is contributed by SURENDRA_GANGWAR.

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function to print the minimum number
// of indices required to be selected
function numberOfIndexes(arr, brr, N, K) {
  // Declare vector to keep track of indexes
  let B = [];
 
  // Set A contains K
  let A = K;
 
  // Traverse the array
  for (let i = 0; i < N; i++) {
    // Adding value that set A can
    // get if no index was chosen
    A += arr[i];
 
    // Insert as B's value
    B.push([brr[i] + 2 * arr[i], i]);
  }
 
  // Sort the vector
 
  // Reverse the vector
  B.sort((a, b) => a[0] - b[0]).reverse();
 
 
  let tot = 0,
    idx = 0;
 
  // Stores chosen indexes
  let ans = [];
 
  // Keep on choosing more indices until
  // B's value is bigger than A or stop
  // incase all the indexes is chosen
  while (A >= tot && idx < B.length) {
    // Update tot
    tot += B[idx][0];
 
    // Update ans
    ans.push(B[idx][1]);
 
    // Increment idx
    idx++;
  }
 
  // If all indices are selected and
  // sum of B is less than sum of A
  if (tot <= A) {
    document.write(-1 + "<br>");
    return;
  }
 
  // Print the minimum number of indices
  document.write(ans.length + "<br>");
  // Print chosen indices
  for (let c of ans) document.write(Number(c) + 1 + " ");
}
 
// Driver Code
 
// Given arrays
let arr = [3, 2, 5, 6];
let brr = [4, 4, 2, 3];
 
// Size of the array
let N = arr.length;
 
// Given value of K
let K = 12;
 
// Function Call
numberOfIndexes(arr, brr, N, K);
 
</script>
Producción: 

3
4 3 1

 

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

Publicación traducida automáticamente

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