Dada una array arr[] que consta de N enteros positivos y un entero positivo K , la tarea es encontrar el número mínimo de elementos que se requiere insertar de modo que todos los números del rango [1, K] se puedan obtener como el suma de cualquier subsecuencia de la array.
Ejemplos:
Entrada: arr[] = {1, 3, 5}, K = 10
Salida: 1
Explicación:
Agregar el elemento {1} a la array modifica la array a {1, 3, 5, 1}. Ahora toda la suma sobre el rango [1, K] se puede obtener como:
- Suma 1: Los elementos son {1}.
- Suma 2: Los elementos son {1, 1}.
- Suma 3: Los elementos son {3}.
- Suma 4: Los elementos son {1. 3}.
- Suma 5: Los elementos son {1, 3, 1}.
- Suma 6: Los elementos son {1, 5}.
- Suma 7: Los elementos son {1, 5, 1}.
- Suma 8: Los elementos son {3, 5}.
- Suma 9: Los elementos son {1, 3, 5}.
- Suma 10: Los elementos son {1, 3, 5, 1}.
Entrada: arr[] = {2, 6, 8, 12, 19}, K = 20
Salida: 2
Enfoque: el problema dado se puede resolver clasificando la array en orden creciente y luego tratando de hacer que el valor de la suma esté en el rango [1, K] usando el hecho de que si la suma de los elementos de la array X , entonces todos los valores en el rango Se puede formar [1, X] . De lo contrario, se requiere insertar el valor (suma + 1) como un elemento de array. Siga los pasos a continuación para resolver el problema:
- Ordene la array arr[] en orden creciente .
- Inicialice la variable, diga índice como 0 para mantener el índice del elemento de array y cuente como 0 para almacenar los elementos totales resultantes agregados.
- Si el valor de arr[0] es mayor que 1 , entonces se debe agregar 1, por lo tanto, aumente el valor de la cuenta en 1 . De lo contrario, aumente el valor del índice en 1 .
- Inicialice la variable, digamos esperar como 2 para mantener el siguiente valor esperado en el rango de 1 a K que se formará a partir de la array arr[] .
- Iterar un bucle hasta que el valor de expect sea como máximo K y realizar los siguientes pasos:
- Si el índice es mayor que igual a N o arr[índice] es mayor que el valor de expect , aumente el valor de count por 1 y multiplique el valor de expect por 2.
- De lo contrario, aumente el valor de expect por arr[index] y aumente el valor del índice por 1 .
- 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++14
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to find the minimum number of elements that must // be added to make the sum of array element over the range // [1, K] void findMinimumNumberOfElements(int n, int k, int arr[]) { // Sort the given array sort(arr, arr + n); // Stores the index for the array int index = 0, count = 0; // If 1 is not present, then append it if (arr[0] > 1) ++count; // Move on to next index else ++index; // The expected value in the array long long expect = 2; while (expect <= k) { // Need to append this number if (index >= n || arr[index] > expect) { ++count; expect += expect; } // Otherwise, expand the range by current number else { expect += arr[index]; ++index; } } // Print the answer cout << count; } // Driver Code int main() { int arr[] = { 2, 6, 8, 12, 19 }; int K = 20; int N = sizeof(arr) / sizeof(arr[0]); findMinimumNumberOfElements(N, K, arr); return 0; } // This code is contributed by Aditya Kumar (adityakumar129)
C
// C program for the above approach #include <stdio.h> #include <stdlib.h> int cmpfunc(const void* a, const void* b) { return (*(int*)a - *(int*)b); } // Function to find the minimum number of elements that must // be added to make the sum of array element over the range // [1, K] void findMinimumNumberOfElements(int n, int k, int arr[]) { // Sort the given array qsort(arr, n, sizeof(int), cmpfunc); // Stores the index for the array int index = 0, count = 0; // If 1 is not present, then append it if (arr[0] > 1) ++count; // Move on to next index else ++index; // The expected value in the array long long expect = 2; while (expect <= k) { // Need to append this number if (index >= n || arr[index] > expect) { ++count; expect += expect; } // Otherwise, expand the range by current number else { expect += arr[index]; ++index; } } // Print the answer printf("%d", count); } // Driver Code int main() { int arr[] = { 2, 6, 8, 12, 19 }; int K = 20; int N = sizeof(arr) / sizeof(arr[0]); findMinimumNumberOfElements(N, K, arr); return 0; } // This code is contributed by Aditya Kumar (adityakumar129)
Java
// Java program for the above approach import java.io.*; import java.util.Arrays; class GFG { // Function to find the minimum number of elements that // must be added to make the sum of array element over // the range [1, K] static void findMinimumNumberOfElements(int n, int k, int[] arr) { // Sort the given array Arrays.sort(arr); // Stores the index for the array int index = 0, count = 0; // If 1 is not present, then append it if (arr[0] > 1) ++count; // Move on to next index else ++index; // The expected value in the array long expect = 2; while (expect <= k) { // Need to append this number if (index >= n || arr[index] > expect) { ++count; expect += expect; } // Otherwise, expand the range by current number else { expect += arr[index]; ++index; } } // Print the answer System.out.println(count); } // Driver Code public static void main(String[] args) { int arr[] = { 2, 6, 8, 12, 19 }; int K = 20; int N = arr.length; findMinimumNumberOfElements(N, K, arr); } } // This code is contributed by Aditya Kumar (adityakumar129)
Python3
# Python 3 program for the above approach # Function to find the minimum number # of elements that must be added to # make the sum of array element over # the range [1, K] def findMinimumNumberOfElements(n, k, arr): # Sort the given array arr.sort() # Stores the index for the # array index = 0 count = 0 if (arr[0] > 1): # If 1 is not present, then # append it count += 1 # Move on to next index else: index += 1 # The expected value in the array expect = 2 while (expect <= k): # Need to append this number if (index >= n or arr[index] > expect): count += 1 expect += expect # Otherwise, expand the range # by current number else: expect += arr[index] index += 1 # Print the answer print(count) # Driver Code if __name__ == '__main__': arr = [2, 6, 8, 12, 19] K = 20 N = len(arr) findMinimumNumberOfElements(N, K, arr) # This code is contributed by ipg2016107.
C#
// C# program for the above approach using System; class GFG { // Function to find the minimum number // of elements that must be added to // make the sum of array element over // the range [1, K] static void findMinimumNumberOfElements(int n, int k, int[] arr) { // Sort the given array Array.Sort(arr); // Stores the index for the // array int index = 0; int count = 0; if (arr[0] > 1) { // If 1 is not present, then // append it ++count; } // Move on to next index else { ++index; } // The expected value in the array long expect = 2; while (expect <= k) { // Need to append this number if (index >= n || arr[index] > expect) { ++count; expect += expect; } // Otherwise, expand the range // by current number else { expect += arr[index]; ++index; } } // Print the answer Console.WriteLine(count); } // Driver code public static void Main() { int[] arr = { 2, 6, 8, 12, 19 }; int K = 20; int N = arr.Length; findMinimumNumberOfElements(N, K, arr); } } // This code is contributed by avijitmondal1998.
Javascript
<script> // Javascript program for the above approach // Function to find the minimum number // of elements that must be added to // make the sum of array element over // the range [1, K] function findMinimumNumberOfElements(n, k, arr) { // Sort the given array arr.sort((a, b) => a - b); // Stores the index for the // array let index = 0; let count = 0; if (arr[0] > 1) { // If 1 is not present, then // append it ++count; } // Move on to next index else { ++index; } // The expected value in the array let expect = 2; while (expect <= k) { // Need to append this number if (index >= n || arr[index] > expect) { ++count; expect += expect; } // Otherwise, expand the range // by current number else { expect += arr[index]; ++index; } } // Print the answer document.write(count); } // Driver Code let arr = [2, 6, 8, 12, 19]; let K = 20; let N = arr.length; findMinimumNumberOfElements(N, K, arr); // This code is contributed by _saurabh_jaiswal. </script>
2
Complejidad de tiempo: O(max(K, N*log N))
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por parthagarwal1962000 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA