Dada una array arr[] que consta de N enteros positivos que representan las longitudes de N cuerdas y un entero positivo K , la tarea es encontrar la longitud máxima de la cuerda que tiene una frecuencia de al menos K cortando cualquier cuerda en cualquier número de piezas.
Ejemplos:
Entrada: arr[] = {5, 2, 7, 4, 9}, K = 5
Salida: 4
Explicación:
A continuación se muestran los posibles cortes de las cuerdas:
- arr[0](= 5) se corta en {4, 1}.
- arr[2](= 7) se corta en {4, 3}.
- arr[4](= 9) se divide en {4, 4, 1}.
Después de las combinaciones de cortes anteriores, la longitud máxima es 4, que es de frecuencia al menos (K = 5).
Entrada: arr[] = {1, 2, 3, 4, 9}, K = 6
Salida: 2
Enfoque: el problema dado se puede resolver utilizando la búsqueda binaria . Siga los pasos a continuación para resolver el problema:
- Inicialice 3 variables, digamos bajo como 1 , alto como el valor máximo de la array arr[] y ans como -1 , para almacenar el límite izquierdo límite derecho para la búsqueda binaria y para almacenar la longitud máxima posible de cuerdas K.
- Iterar hasta que low sea menor o igual que high y realizar los siguientes pasos:
- Encuentre el valor medio del rango [bajo, alto] y guárdelo en una variable, digamos mid .
- Recorra la array arr[] y encuentre el recuento de cuerdas de longitud media que se puede obtener cortando las cuerdas y guárdelo en una variable, por ejemplo, count .
- Si el valor de count es al menos K , actualice el valor de mid como ans y actualice el valor de low como (mid + 1) .
- De lo contrario, actualice el valor de high as (mid – 1) .
- Después de completar los pasos, imprima el valor de ans 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 the maximum size // of ropes having frequency at least // K by cutting the given ropes int maximumSize(int a[], int k, int n) { // Stores the left and // the right boundaries int low = 1; int high = *max_element(a, a + n); // Stores the maximum length // of rope possible int ans = -1; // Iterate while low is less // than or equal to high while (low <= high) { // Stores the mid value of // the range [low, high] int mid = low + (high - low) / 2; // Stores the count of ropes // of length mid int count = 0; // Traverse the array arr[] for (int c = 0; c < n; c++) { count += a / mid; } // If count is at least K if (count >= k) { // Assign mid to ans ans = mid; // Update the value // of low low = mid + 1; } // Otherwise, update the // value of high else { high = mid - 1; } } // Return the value of ans return ans; } // Driver Code int main() { int arr[] = { 1, 2, 3, 4, 9 }; int K = 6; int n = sizeof(arr) / sizeof(arr[0]); cout << (maximumSize(arr, K, n)); } // This code is contributed by ukasp
Java
// Java program for the above approach import java.util.*; class GFG { // Function to find the maximum size // of ropes having frequency at least // K by cutting the given ropes static int maximumSize(Integer[] a, int k) { // Stores the left and // the right boundaries int low = 1; int high = Collections.max( Arrays.asList(a)); // Stores the maximum length // of rope possible int ans = -1; // Iterate while low is less // than or equal to high while (low <= high) { // Stores the mid value of // the range [low, high] int mid = low + (high - low) / 2; // Stores the count of ropes // of length mid int count = 0; // Traverse the array arr[] for (int c = 0; c < a.length; c++) { count += a / mid; } // If count is at least K if (count >= k) { // Assign mid to ans ans = mid; // Update the value // of low low = mid + 1; } // Otherwise, update the // value of high else { high = mid - 1; } } // Return the value of ans return ans; } // Driver Code public static void main(String[] args) { Integer[] arr = { 1, 2, 3, 4, 9 }; int K = 6; System.out.println( maximumSize(arr, K)); } }
Python3
# Python program for the above approach # Function to find the maximum size # of ropes having frequency at least # K by cutting the given ropes def maximumSize(a, k): # Stores the left and # the right boundaries low = 1 high = max(a) # Stores the maximum length # of rope possible ans = -1 # Iterate while low is less # than or equal to high while (low <= high): # Stores the mid value of # the range [low, high] mid = low + (high - low) // 2 # Stores the count of ropes # of length mid count = 0 # Traverse the array arr[] for c in range(len(a)): count += a // mid # If count is at least K if (count >= k): # Assign mid to ans ans = mid # Update the value # of low low = mid + 1 # Otherwise, update the # value of high else: high = mid - 1 # Return the value of ans return ans # Driver Code if __name__ == '__main__': arr = [1, 2, 3, 4, 9] K = 6 print(maximumSize(arr, K)) # This code is contributed by mohit kumar 29.
C#
// C# program for the above approach using System; using System.Linq; class GFG{ // Function to find the maximum size // of ropes having frequency at least // K by cutting the given ropes static int maximumSize(int[] a, int k) { // Stores the left and // the right boundaries int low = 1; int high = a.Max(); // Stores the maximum length // of rope possible int ans = -1; // Iterate while low is less // than or equal to high while (low <= high) { // Stores the mid value of // the range [low, high] int mid = low + (high - low) / 2; // Stores the count of ropes // of length mid int count = 0; // Traverse the array []arr for(int c = 0; c < a.Length; c++) { count += a / mid; } // If count is at least K if (count >= k) { // Assign mid to ans ans = mid; // Update the value // of low low = mid + 1; } // Otherwise, update the // value of high else { high = mid - 1; } } // Return the value of ans return ans; } // Driver Code public static void Main(String[] args) { int[] arr = { 1, 2, 3, 4, 9 }; int K = 6; Console.WriteLine( maximumSize(arr, K)); } } // This code is contributed by 29AjayKumar
Javascript
<script> // Javascript program for the above approach // Function to find the maximum size // of ropes having frequency at least // K by cutting the given ropes function maximumSize( a, k) { // Stores the left and // the right boundaries let low = 1; let high = Math.max.apply(Math, a); // Stores the maximum length // of rope possible let ans = -1; // Iterate while low is less // than or equal to high while (low <= high) { // Stores the mid value of // the range [low, high] let mid = Math.floor(low + (high - low) / 2); // Stores the count of ropes // of length mid let count = 0; // Traverse the array arr[] for (let c = 0; c < a.length; c++) { count += Math.floor(a / mid); } // If count is at least K if (count >= k) { // Assign mid to ans ans = mid; // Update the value // of low low = mid + 1; } // Otherwise, update the // value of high else { high = mid - 1; } } // Return the value of ans return ans; } // Driver Code let arr = [ 1, 2, 3, 4, 9 ]; let K = 6; document.write(maximumSize(arr, K)) // This code is contributed by Hritik </script>
2
Complejidad de tiempo: O(N * log N)
Espacio auxiliar: O(1)