Dado norte máquinas representadas por una matriz de números enteros llegar[] dónde llegar[yo] denota el tiempo (en segundos) que tarda el i-ésimo máquina para producir uno artículo. todas las maquinas funcionan simultáneamente y continuamente. Además también se nos da un número entero. metro que representa el número total de elementos requeridos . La tarea es determinar la tiempo minimo necesario para producir exactamente metro artículos de manera eficiente.
Ejemplos:
Aporte: arreglo[] = [2 4 5] m = 7
Producción: 8
Explicación: La forma óptima de producir. 7 artículos en el mínimo el tiempo es 8 artículos de segunda clase. Cada máquina produce artículos a diferentes ritmos:
- Máquina 1 produce un artículo cada 2 segundos → Produce 8/2 = 4 artículos en 8 artículos de segunda clase.
- maquina 2 produce un artículo cada 4 segundos → Produce 8/4 = 2 artículos en 8 artículos de segunda clase.
- maquina 3 produce un artículo cada 5 segundos → Produce 8/5 = 1 artículo en 8 artículos de segunda clase.
Total de artículos producidos en 8 segundos = 4 + 2 + 1 = 7
Aporte: arreglo[] = [2 3 5 7] m = 10
Producción: 9
Explicación: La forma óptima de producir. 10 artículos en el mínimo el tiempo es 9 artículos de segunda clase. Cada máquina produce artículos a diferentes ritmos:
- La máquina 1 produce un artículo cada 2 segundos - Produce 9/2 = 4 artículos en 9 segundos.
- La máquina 2 produce un artículo cada 3 segundos - Produce 9/3 = 3 artículos en 9 segundos.
- La máquina 3 produce un artículo cada 5 segundos - Produce 9/5 = 1 artículo en 9 segundos.
- La máquina 4 produce un artículo cada 7 segundos - Produce 9/7 = 1 artículo en 9 segundos.
Total de artículos producidos en 9 segundos = 4 + 3 + 1 + 1 = 10
Tabla de contenido
- Uso del método de fuerza bruta: tiempo O(n*m*min(arr)) y espacio O(1)
- Uso de la búsqueda binaria: O(n*log(m*min(arr))) Tiempo y O(1) Espacio
Uso del método de fuerza bruta: tiempo O(n*m*min(arr)) y espacio O(1)
C++La idea es comprobar incrementalmente el tiempo mínimo requerido para producir exactamente metro elementos. Empezamos con tiempo = 1 y siga incrementándolo hasta que el total de artículos producidos por todas las máquinas ≥ metro . En cada paso de tiempo calculamos el número de artículos que cada máquina puede producir usando hora / llegada[i] y resumirlos. Como todas las máquinas funcionan simultáneamente este enfoque garantiza que encontremos el tiempo válido más pequeño.
// C++ program to find minimum time // required to produce m items using // Brute Force Approach #include using namespace std; int minTimeReq(vector<int> &arr int m) { // Start checking from time = 1 int time = 1; while (true) { int totalItems = 0; // Calculate total items produced at // current time for (int i = 0; i < arr.size(); i++) { totalItems += time / arr[i]; } // If we produce at least m items // return the time if (totalItems >= m) { return time; } // Otherwise increment time and // continue checking time++; } } int main() { vector<int> arr = {2 4 5}; int m = 7; cout << minTimeReq(arr m) << endl; return 0; }
Java // Java program to find minimum time // required to produce m items using // Brute Force Approach import java.util.*; class GfG { static int minTimeReq(int arr[] int m) { // Start checking from time = 1 int time = 1; while (true) { int totalItems = 0; // Calculate total items produced at // current time for (int i = 0; i < arr.length; i++) { totalItems += time / arr[i]; } // If we produce at least m items // return the time if (totalItems >= m) { return time; } // Otherwise increment time and // continue checking time++; } } public static void main(String[] args) { int arr[] = {2 4 5}; int m = 7; System.out.println(minTimeReq(arr m)); } }
Python # Python program to find minimum time # required to produce m items using # Brute Force Approach def minTimeReq(arr m): # Start checking from time = 1 time = 1 while True: totalItems = 0 # Calculate total items produced at # current time for i in range(len(arr)): totalItems += time // arr[i] # If we produce at least m items # return the time if totalItems >= m: return time # Otherwise increment time and # continue checking time += 1 if __name__ == '__main__': arr = [2 4 5] m = 7 print(minTimeReq(arr m))
C# // C# program to find minimum time // required to produce m items using // Brute Force Approach using System; class GfG { static int minTimeReq(int[] arr int m) { // Start checking from time = 1 int time = 1; while (true) { int totalItems = 0; // Calculate total items produced at // current time for (int i = 0; i < arr.Length; i++) { totalItems += time / arr[i]; } // If we produce at least m items // return the time if (totalItems >= m) { return time; } // Otherwise increment time and // continue checking time++; } } public static void Main() { int[] arr = {2 4 5}; int m = 7; Console.WriteLine(minTimeReq(arr m)); } }
JavaScript // JavaScript program to find minimum time // required to produce m items using // Brute Force Approach function minTimeReq(arr m) { // Start checking from time = 1 let time = 1; while (true) { let totalItems = 0; // Calculate total items produced at // current time for (let i = 0; i < arr.length; i++) { totalItems += Math.floor(time / arr[i]); } // If we produce at least m items // return the time if (totalItems >= m) { return time; } // Otherwise increment time and // continue checking time++; } } // Input values let arr = [2 4 5]; let m = 7; console.log(minTimeReq(arr m));
Producción
8
Complejidad del tiempo: O(n*m*min(arr)) porque para cada unidad de tiempo (hasta m * min(arr)) iteramos a través de n máquinas para contar los artículos producidos.
Complejidad espacial: O(1) ya que sólo se utilizan unas pocas variables enteras; no se asigna espacio adicional.
Uso de la búsqueda binaria: O(n*log(m*min(arr))) Tiempo y O(1) Espacio
El idea es usar Búsqueda binaria en lugar de comprobar cada vez secuencialmente observamos que el total de artículos producidos en un tiempo determinado t se puede calcular en En) . La observación clave es que el mínimo tiempo posible es 1 y el tiempo máximo posible es m * minTiempoMáquina . Al aplicar búsqueda binaria en este rango verificamos repetidamente el valor medio para determinar si es suficiente y ajustamos el espacio de búsqueda en consecuencia.
Pasos para implementar la idea anterior:
- Establecer a la izquierda a 1 y bien a m * minTiempoMáquina para definir el espacio de búsqueda.
- Inicializar y con bien para almacenar el tiempo mínimo requerido.
- Ejecutar búsqueda binaria mientras izquierda es menor o igual a bien .
- Calcular a mitad y calcular el total de artículos iterando a través de llegar y resumiendo medio / llegada[i] .
- Si totalItems es al menos m actualizar años y buscar un tiempo menor. De lo contrario ajuste izquierda a medio + 1 por un tiempo mayor.
- Continuar buscando hasta encontrar el tiempo mínimo óptimo.
// C++ program to find minimum time // required to produce m items using // Binary Search Approach #include using namespace std; int minTimeReq(vector<int> &arr int m) { // Find the minimum value in arr manually int minMachineTime = arr[0]; for (int i = 1; i < arr.size(); i++) { if (arr[i] < minMachineTime) { minMachineTime = arr[i]; } } // Define the search space int left = 1; int right = m * minMachineTime; int ans = right; while (left <= right) { // Calculate mid time int mid = left + (right - left) / 2; int totalItems = 0; // Calculate total items produced in 'mid' time for (int i = 0; i < arr.size(); i++) { totalItems += mid / arr[i]; } // If we can produce at least m items // update answer if (totalItems >= m) { ans = mid; // Search for smaller time right = mid - 1; } else { // Search in right half left = mid + 1; } } return ans; } int main() { vector<int> arr = {2 4 5}; int m = 7; cout << minTimeReq(arr m) << endl; return 0; }
Java // Java program to find minimum time // required to produce m items using // Binary Search Approach import java.util.*; class GfG { static int minTimeReq(int[] arr int m) { // Find the minimum value in arr manually int minMachineTime = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] < minMachineTime) { minMachineTime = arr[i]; } } // Define the search space int left = 1; int right = m * minMachineTime; int ans = right; while (left <= right) { // Calculate mid time int mid = left + (right - left) / 2; int totalItems = 0; // Calculate total items produced in 'mid' time for (int i = 0; i < arr.length; i++) { totalItems += mid / arr[i]; } // If we can produce at least m items // update answer if (totalItems >= m) { ans = mid; // Search for smaller time right = mid - 1; } else { // Search in right half left = mid + 1; } } return ans; } public static void main(String[] args) { int[] arr = {2 4 5}; int m = 7; System.out.println(minTimeReq(arr m)); } }
Python # Python program to find minimum time # required to produce m items using # Binary Search Approach def minTimeReq(arr m): # Find the minimum value in arr manually minMachineTime = arr[0] for i in range(1 len(arr)): if arr[i] < minMachineTime: minMachineTime = arr[i] # Define the search space left = 1 right = m * minMachineTime ans = right while left <= right: # Calculate mid time mid = left + (right - left) // 2 totalItems = 0 # Calculate total items produced in 'mid' time for i in range(len(arr)): totalItems += mid // arr[i] # If we can produce at least m items # update answer if totalItems >= m: ans = mid # Search for smaller time right = mid - 1 else: # Search in right half left = mid + 1 return ans if __name__ == '__main__': arr = [2 4 5] m = 7 print(minTimeReq(arr m))
C# // C# program to find minimum time // required to produce m items using // Binary Search Approach using System; class GfG { static int minTimeReq(int[] arr int m) { // Find the minimum value in arr manually int minMachineTime = arr[0]; for (int i = 1; i < arr.Length; i++) { if (arr[i] < minMachineTime) { minMachineTime = arr[i]; } } // Define the search space int left = 1; int right = m * minMachineTime; int ans = right; while (left <= right) { // Calculate mid time int mid = left + (right - left) / 2; int totalItems = 0; // Calculate total items produced in 'mid' time for (int i = 0; i < arr.Length; i++) { totalItems += mid / arr[i]; } // If we can produce at least m items // update answer if (totalItems >= m) { ans = mid; // Search for smaller time right = mid - 1; } else { // Search in right half left = mid + 1; } } return ans; } static void Main() { int[] arr = {2 4 5}; int m = 7; Console.WriteLine(minTimeReq(arr m)); } }
JavaScript // JavaScript program to find minimum time // required to produce m items using // Binary Search Approach function minTimeReq(arr m) { // Find the minimum value in arr manually let minMachineTime = arr[0]; for (let i = 1; i < arr.length; i++) { if (arr[i] < minMachineTime) { minMachineTime = arr[i]; } } // Define the search space let left = 1; let right = m * minMachineTime; let ans = right; while (left <= right) { // Calculate mid time let mid = Math.floor(left + (right - left) / 2); let totalItems = 0; // Calculate total items produced in 'mid' time for (let i = 0; i < arr.length; i++) { totalItems += Math.floor(mid / arr[i]); } // If we can produce at least m items // update answer if (totalItems >= m) { ans = mid; // Search for smaller time right = mid - 1; } else { // Search in right half left = mid + 1; } } return ans; } // Driver code let arr = [2 4 5]; let m = 7; console.log(minTimeReq(arr m));
Producción
8
Complejidad del tiempo: O(n log(m*min(arr))) ya que la búsqueda binaria se ejecuta log(m × min(arr)) veces cada vez que verifica n máquinas.
Complejidad espacial: O(1) ya que solo se utilizan unas pocas variables adicionales, lo que hace que el espacio sea constante.