logo

Мінімальний час виготовлення m виробів

Дано п машини, представлені масивом цілих чисел обр[] де arr[i] позначає час (у секундах), витрачений на і-й машина для виробництва один пункт. Всі машини працюють одночасно і безперервно. Крім того, нам також дано ціле число м що представляє загальну кількість потрібні предмети . Завдання полягає в тому, щоб визначити мінімальний час необхідно виготовити саме м предметів ефективно.

приклади:  

введення: arr[] = [2 4 5] m = 7
Вихід: 8
Пояснення: Оптимальний спосіб виробництва 7 елементи в мінімум час є 8 секунд. Кожна машина виробляє елементи з різною швидкістю:



  • Машина 1 виробляє предмет кожен 2 секунд → Виробляє 8/2 = 4 елементи в 8 секунд.
  • Машина 2 виробляє предмет кожен 4 секунд → Виробляє 8/4 = 2 елементи в 8 секунд.
  • Машина 3 виробляє предмет кожен 5 секунд → Виробляє 8/5 = 1 пункт в 8 секунд.

Всього вироблено в 8 секунд = 4 + 2 + 1 = 7


введення: arr[] = [2 3 5 7] m = 10
Вихід: 9
Пояснення: Оптимальний спосіб виробництва 10 елементи в мінімум час є 9 секунд. Кожна машина виробляє елементи з різною швидкістю:

  • Машина 1 виробляє один предмет кожен 2 секунд - Виробляє 9/2 = 4 предметів за 9 секунд.
  • Машина 2 виробляє кожен предмет 3 секунд - Виробляє 9/3 = 3 предметів за 9 секунд.
  • Машина 3 виробляє один предмет кожен 5 секунд - Виробляє 9/5 = 1 елемент за 9 секунд.
  • Машина 4 виробляє один предмет кожен 7 секунд - Виробляє 9/7 = 1 елемент за 9 секунд.

Всього вироблено в 9 секунд = 4 + 3 + 1 + 1 = 10

Зміст

Використання методу грубої сили - O(n*m*min(arr)) часу та O(1) простору

Ідея полягає в тому, щоб поетапно перевіряти мінімальний час, необхідний для точного виготовлення м елементи. Ми починаємо з час = 1 і продовжуйте збільшувати його, доки загальна кількість предметів, вироблених усіма машинами ≥ м . На кожному кроці ми обчислюємо кількість елементів, які може виготовити кожна машина час / прибуття[i] і підсумуйте їх. Оскільки всі машини працюють одночасно цей підхід гарантує, що ми знайдемо найменший дійсний час.

C++
// 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)); 

Вихід
8 

Часова складність: O(n*m*min(arr)) оскільки для кожної одиниці часу (до m * min(arr)) ми проходимо n машин, щоб підрахувати вироблені елементи.
Просторова складність: O(1) оскільки використовується лише кілька цілих змінних; додаткове місце не виділяється.

Використання двійкового пошуку - O(n*log(m*min(arr))) Час і O(1) Пробіл

The ідея це використовувати Двійковий пошук замість того, щоб перевіряти кожен раз послідовно ми спостерігаємо, що загальна кількість виробів, вироблених за певний час Т можна обчислити в O(n) . Ключове спостереження полягає в тому, що мінімально можливий час 1 а максимально можливий час становить m * minMachineTime . Звернувшись двійковий пошук у цьому діапазоні ми неодноразово перевіряємо середнє значення, щоб визначити, чи його достатньо, і відповідно коригуємо простір пошуку.

Кроки для реалізації вищезазначеної ідеї:

  • Встановити ліворуч до 1 і правильно до m * minMachineTime щоб визначити простір пошуку.
  • Ініціалізація ans з правильно зберігати мінімальний необхідний час.
  • Запустіть двійковий пошук поки зліва менше або дорівнює правильно .
  • Розрахувати середину і обчислити totalItems шляхом повторення обр та підведення підсумків середина / дохід[i] .
  • Якщо totalItems становить принаймні m оновлення років і шукати менший час. Інакше відрегулюйте зліва до середина + 1 на більший час.
  • Продовжити пошук поки не буде знайдено оптимальний мінімальний час.
C++
// 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)); 

Вихід
8 

Часова складність: O(n log(m*min(arr))) оскільки двійковий пошук запускає log(m × min(arr)) разів, перевіряючи n машин.
Просторова складність: O(1) оскільки використовується лише кілька додаткових змінних, що робить його постійним простором.
 

Створіть вікторину