Longitud máxima de todos los K cables de igual longitud posibles generados cortando N cables

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:

  1. arr[0](= 5) se corta en {4, 1}.
  2. arr[2](= 7) se corta en {4, 3}.
  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>
Producción: 

2

 

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

Publicación traducida automáticamente

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