Dato N macchine rappresentate da un array di numeri interi arr[] Dove arr[i] indica il tempo (in secondi) impiegato dal i-esimo macchina per produrre uno articolo. Tutte le macchine funzionano contemporaneamente e continuamente. Inoltre ci viene fornito anche un numero intero M che rappresenta il numero totale di elementi richiesti . Il compito è determinare il tempo minimo necessario per produrre esattamente M articoli in modo efficiente.
Esempi:
Ingresso: arr[] = [2 4 5] m = 7
Produzione: 8
Spiegazione: Il modo ottimale di produrre 7 elementi in minimo il tempo è 8 secondi. Ogni macchina produce articoli a velocità diverse:
- Macchina 1 produce un oggetto ogni 2 secondi → Produce 8/2 = 4 elementi dentro 8 secondi.
- Macchina 2 produce un oggetto ogni 4 secondi → Produce 8/4 = 2 elementi dentro 8 secondi.
- Macchina 3 produce un oggetto ogni 5 secondi → Produce 8/5 = 1 elemento in 8 secondi.
Totale articoli prodotti in 8 secondi = 4 + 2 + 1 = 7
Ingresso: arr[] = [2 3 5 7] m = 10
Produzione: 9
Spiegazione: Il modo ottimale di produrre 10 elementi in minimo il tempo è 9 secondi. Ogni macchina produce articoli a velocità diverse:
- La macchina 1 produce un articolo ogni 2 secondi - Produce 9/2 = 4 elementi in 9 secondi.
- La macchina 2 produce un articolo ogni 3 secondi - Produce 9/3 = 3 elementi in 9 secondi.
- La macchina 3 produce un articolo ogni 5 secondi - Produce 9/5 = 1 elemento in 9 secondi.
- La macchina 4 produce un articolo ogni 7 secondi - Produce 9/7 = 1 elemento in 9 secondi.
Totale articoli prodotti in 9 secondi = 4 + 3 + 1 + 1 = 10
Sommario
- Utilizzando il metodo della forza bruta: tempo O(n*m*min(arr)) e spazio O(1).
- Utilizzo della ricerca binaria: O(n*log(m*min(arr))) Tempo e O(1) Spazio
Utilizzando il metodo della forza bruta: tempo O(n*m*min(arr)) e spazio O(1).
C++L'idea è quella di controllare in modo incrementale il tempo minimo richiesto per produrre esattamente M elementi. Iniziamo con tempo = 1 e continuare ad aumentarlo fino al totale degli articoli prodotti da tutte le macchine ≥m . Ad ogni passaggio temporale calcoliamo il numero di articoli che ciascuna macchina può produrre utilizzando ora / arr[i] e riassumerli. Poiché tutte le macchine funzionano contemporaneamente questo approccio garantisce di trovare il tempo valido più piccolo.
// 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));
Produzione
8
Complessità temporale: O(n*m*min(arr)) perché per ogni unità di tempo (fino a m * min(arr)) iteriamo attraverso n macchine per contare gli articoli prodotti.
Complessità spaziale: O(1) poiché vengono utilizzate solo poche variabili intere; non viene assegnato spazio aggiuntivo.
Utilizzo della ricerca binaria: O(n*log(m*min(arr))) Tempo e O(1) Spazio
IL idea è usare Ricerca binaria invece di controllare ogni volta in sequenza osserviamo che il totale degli articoli prodotti in un dato tempo T può essere computato SU) . L'osservazione chiave è che il tempo minimo possibile è 1 e il tempo massimo possibile è m * minTempoMacchina . Applicando ricerca binaria su questo intervallo controlliamo ripetutamente il valore medio per determinare se è sufficiente e adattiamo di conseguenza lo spazio di ricerca.
Passaggi per implementare l'idea di cui sopra:
- Impostato a sinistra a 1 e Giusto A m * minTempoMacchina per definire lo spazio di ricerca.
- Inizializza ans con Giusto per memorizzare il tempo minimo richiesto.
- Esegui la ricerca binaria Mentre Sinistra è inferiore o uguale a Giusto .
- Calcola la metà e calcolare totalItems eseguendo un'iterazione arr e riassumendo metà / arr[i] .
- Se totalItems è almeno m aggiornamento anni E cercare un tempo più piccolo. Altrimenti regolatevi Sinistra A metà + 1 per un tempo maggiore.
- Continua la ricerca fino a quando non viene trovato il tempo minimo ottimale.
// 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));
Produzione
8
Complessità temporale: O(n log(m*min(arr))) poiché la ricerca binaria viene eseguita log(m × min(arr)) volte ciascuno controllando n macchine.
Complessità spaziale: O(1) poiché vengono utilizzate solo poche variabili extra rendendolo uno spazio costante.