Dat n mașini reprezentate printr-un tablou întreg arr[] unde arr[i] indică timpul (în secunde) luat de i-a mașină de produs unul articol. Toate mașinile funcționează simultan si continuu. În plus, ni se dă și un număr întreg m reprezentând numărul total de elementele necesare . Sarcina este de a determina timp minim necesare pentru a produce exact m articole în mod eficient.
Exemple:
Intrare: arr[] = [2 4 5] m = 7
Ieșire: 8
Explicaţie: Modul optim de a produce 7 elementele din minim timpul este 8 secunde. Fiecare mașină produce articole la rate diferite:
- Masina 1 produce câte un articol 2 secunde → Produce 8/2 = 4 articole în 8 secunde.
- Masina 2 produce câte un articol 4 secunde → Produce 8/4 = 2 articole în 8 secunde.
- Masina 3 produce câte un articol fiecare 5 secunde → Produce 8/5 = 1 element în 8 secunde.
Total articole produse în 8 secunde = 4 + 2 + 1 = 7
Intrare: arr[] = [2 3 5 7] m = 10
Ieșire: 9
Explicaţie: Modul optim de a produce 10 elementele din minim timpul este 9 secunde. Fiecare mașină produce articole la rate diferite:
- Mașina 1 produce câte un articol 2 secunde - Produce 9/2 = 4 articole în 9 secunde.
- Mașina 2 produce câte un articol 3 secunde - Produce 9/3 = 3 articole în 9 secunde.
- Mașina 3 produce câte un articol 5 secunde - Produce 9/5 = 1 articol în 9 secunde.
- Mașina 4 produce câte un articol 7 secunde - Produce 9/7 = 1 articol în 9 secunde.
Total articole produse în 9 secunde = 4 + 3 + 1 + 1 = 10
Cuprins
- Folosind metoda forței brute - O(n*m*min(arr)) Timp și O(1) spațiu
- Utilizarea căutării binare - O(n*log(m*min(arr))) Timp și O(1) spațiu
Folosind metoda forței brute - O(n*m*min(arr)) Timp și O(1) spațiu
C++Ideea este să verifica treptat timpul minim necesar pentru a produce exact m articole. Începem cu timp = 1 și continuă să o crești până la numărul total de articole produse de toate mașinile ≥ m . La fiecare pas de timp calculăm numărul de articole pe care fiecare mașină le poate produce folosind timp/arr[i] si rezuma-le. Din moment ce toate mașinile funcționează simultan această abordare ne asigură că găsim cel mai mic timp valabil.
// 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));
Ieșire
8
Complexitatea timpului: O(n*m*min(arr)) deoarece pentru fiecare unitate de timp (până la m * min(arr)) iterăm prin n mașini pentru a număra articolele produse.
Complexitatea spațiului: O(1) deoarece sunt folosite doar câteva variabile întregi; nu este alocat spațiu suplimentar.
Utilizarea căutării binare - O(n*log(m*min(arr))) Timp și O(1) spațiu
The idee este de a folosi Căutare binară în loc să verifice de fiecare dată secvenţial observăm că totalul articolelor produse într-un timp dat T poate fi calculat în Pe) . Observația cheie este că timpul minim posibil este 1 iar timpul maxim posibil este m * minMachineTime . Prin aplicare căutare binară pe acest interval verificăm în mod repetat valoarea medie pentru a determina dacă este suficientă și ajustăm spațiul de căutare în consecință.
Pași pentru implementarea ideii de mai sus:
- Set stânga la 1 și corect la m * minMachineTime pentru a defini spațiul de căutare.
- Inițializați ans cu corect pentru a stoca timpul minim necesar.
- Rulați căutarea binară în timp ce stânga este mai mic sau egal cu corect .
- Calculați mijlocul și calculați totalItems prin iterarea prin arr si rezumand la mijloc/arr[i] .
- Dacă totalItems este de cel puțin m actualizare ani şi caută un timp mai mic. În caz contrar, ajustați stânga la mijlocul + 1 pentru un timp mai mare.
- Continuați căutarea până la găsirea timpului minim optim.
// 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));
Ieșire
8
Complexitatea timpului: O(n log(m*min(arr))) deoarece Binary Search rulează log(m × min(arr)) ori fiecare verificând n mașini.
Complexitatea spațiului: O(1) deoarece sunt folosite doar câteva variabile suplimentare, făcându-l spațiu constant.