Dados dos enteros positivos W y H y N rectángulos de dimensión W*H , la tarea es encontrar el tamaño más pequeño del cuadrado requerido para que todos los N rectángulos puedan empaquetarse sin superponerse.
Ejemplos:
Entrada: N = 10, W = 2, H = 3
Salida: 9
Explicación:
El tamaño más pequeño del cuadrado es de 9 unidades para empaquetar los 10 rectángulos dados de tamaño 2*3 como se ilustra en la siguiente imagen:Entrada: N = 1, W = 3, H = 3
Salida: 3
Enfoque: El problema dado se basa en las siguientes observaciones:
- Se puede demostrar que uno de los espaciamientos óptimos de los rectángulos dentro de un cuadrado viene dado por:
- El número máximo de rectángulos de dimensión W*H, que se pueden encajar en el cuadrado de lados X viene dado por ⌊X/W⌋⋅⌊X/H⌋ .
- La función anterior es monótonamente creciente. Por lo tanto, la idea es usar la búsqueda binaria para encontrar el lado más pequeño de un cuadrado que satisfaga la condición dada.
Siga los pasos a continuación para resolver el problema:
- Inicialice dos variables, digamos bajo como 1 y alto como W*H*N .
- Iterar hasta que i sea menor que j y realizar los siguientes pasos:
- Encuentre el valor de mid como (i + j)/2 .
- Ahora, si el valor (mid/W)*(mid/H) es como máximo N , actualice el valor de high como mid .
- De lo contrario, actualice el valor de low como (mid + 1) .
- Después de completar los pasos anteriores, imprima el valor de alto como el valor resultante.
A continuación se muestra la implementación del enfoque anterior:
C++
// CPP program for the above approach #include<bits/stdc++.h> using namespace std; // Function to check if side of square X // can pack all the N rectangles or not bool bound(int w, int h, int N, int x) { // Find the number of rectangle // it can pack int val = (x / w) * (x / h); // If val is atleast N, // then return true if (val >= N) return true; // Otherwise, return false else return false; } // Function to find the size of the // smallest square that can contain // N rectangles of dimensions W * H int FindSquare(int N, int W, int H) { // Stores the lower bound int i = 1; // Stores the upper bound int j = W * H * N; // Iterate until i is less than j while (i < j) { // Calculate the mid value int mid = i + (j - i) / 2; // If the current size of square // cam contain N rectangles if (bound(W, H, N, mid)) j = mid; // Otherwise, update i else i = mid + 1; } // Return the minimum size of the // square required return j; } // Driver code int main() { int W = 2; int H = 3; int N = 10; // Function Call cout << FindSquare(N, W, H); } // This code is contributed by ipg2016107.
Java
// Java program for the above approach class GFG{ // Function to check if side of square X // can pack all the N rectangles or not static boolean bound(int w, int h, int N, int x) { // Find the number of rectangle // it can pack int val = (x / w) * (x / h); // If val is atleast N, // then return true if (val >= N) return true; // Otherwise, return false else return false; } // Function to find the size of the // smallest square that can contain // N rectangles of dimensions W * H static int FindSquare(int N, int W, int H) { // Stores the lower bound int i = 1; // Stores the upper bound int j = W * H * N; // Iterate until i is less than j while (i < j) { // Calculate the mid value int mid = i + (j - i) / 2; // If the current size of square // cam contain N rectangles if (bound(W, H, N, mid)) j = mid; // Otherwise, update i else i = mid + 1; } // Return the minimum size of the // square required return j; } // Driver code public static void main(String[] args) { int W = 2; int H = 3; int N = 10; // Function Call System.out.print(FindSquare(N, W, H)); } } // This code is contributed by sk944795
Python3
# Python program for the above approach # Function to check if side of square X # can pack all the N rectangles or not def bound(w, h, N, x): # Find the number of rectangle # it can pack val = (x//w)*(x//h) # If val is atleast N, # then return true if(val >= N): return True # Otherwise, return false else: return False # Function to find the size of the # smallest square that can contain # N rectangles of dimensions W * H def FindSquare(N, W, H): # Stores the lower bound i = 1 # Stores the upper bound j = W * H*N # Iterate until i is less than j while(i < j): # Calculate the mid value mid = i + (j - i)//2 # If the current size of square # cam contain N rectangles if(bound(W, H, N, mid)): j = mid # Otherwise, update i else: i = mid + 1 # Return the minimum size of the # square required return j # Driver Code W = 2 H = 3 N = 10 # Function Call print(FindSquare(N, W, H))
C#
// C# program for the above approach using System; class GFG{ // Function to check if side of square X // can pack all the N rectangles or not static bool bound(int w, int h, int N, int x) { // Find the number of rectangle // it can pack int val = (x / w) * (x / h); // If val is atleast N, // then return true if (val >= N) return true; // Otherwise, return false else return false; } // Function to find the size of the // smallest square that can contain // N rectangles of dimensions W * H static int FindSquare(int N, int W, int H) { // Stores the lower bound int i = 1; // Stores the upper bound int j = W * H * N; // Iterate until i is less than j while (i < j) { // Calculate the mid value int mid = i + (j - i) / 2; // If the current size of square // cam contain N rectangles if (bound(W, H, N, mid)) j = mid; // Otherwise, update i else i = mid + 1; } // Return the minimum size of the // square required return j; } // Driver Code public static void Main() { int W = 2; int H = 3; int N = 10; // Function Call Console.WriteLine(FindSquare(N, W, H)); } } // This code is contributed by ukasp
Javascript
<script> // Javascript program for the above approach // Function to check if side of square X // can pack all the N rectangles or not function bound(w, h, N, x) { // Find the number of rectangle // it can pack let val = parseInt(x / w) * parseInt(x / h); // If val is atleast N, // then return true if (val >= N) return true; // Otherwise, return false else return false; } // Function to find the size of the // smallest square that can contain // N rectangles of dimensions W * H function FindSquare(N, W, H) { // Stores the lower bound let i = 1; // Stores the upper bound let j = W * H * N; // Iterate until i is less than j while (i < j) { // Calculate the mid value let mid = i + parseInt((j - i) / 2); // If the current size of square // cam contain N rectangles if (bound(W, H, N, mid)) j = mid; // Otherwise, update i else i = mid + 1; } // Return the minimum size of the // square required return j; } // Driver code let W = 2; let H = 3; let N = 10; // Function Call document.write(FindSquare(N, W, H)); </script>
9
Complejidad de tiempo: O(log(W*H))
Espacio auxiliar: O(1)
Publicación traducida automáticamente
Artículo escrito por maheswaripiyush9 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA