# Minimum time required to produce m items

Consider n machines which produce same type of items but at different rate i.e., machine 1 takes a1 sec to produce an item, machine 2 takes a2 sec to produce an item. Given an array which contains the time required by ith machine to produce an item. Considering all machine are working simultaneously, the task is to find minimum time required to produce m items.

Examples:

Input : arr[] = {1, 2, 3}, m = 11
Output : 6
In 6 sec, machine 1 produces 6 items, machine 2 produces 3 items,
and machine 3 produces 2 items. So to produce 11 items minimum
6 sec are required.

Input : arr[] = {5, 6}, m = 11
Output : 30

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Method 1 : (Brute Force)

Initialize time = 0 and increment it by 1. Calculate number of item produce at each time until number of produced items is not equal to m.

Below is the C++ implementation of this approach:

// C++ program to find minimum time
// required to produce m items.
#include<bits/stdc++.h>
using namespace std;

// Return the minimum time required to
// produce m items with given machines.
int minTime(int arr[], int n, int m)
{
// Intialise time, items equal to 0.
int t = 0;

while (1)
{
int items = 0;

// Calculating items at each second
for (int i = 0; i < n; i++)
items += (t / arr[i]);

// If items equal to m return time.
if (items >= m)
return t;

t++; // Increment time
}
}

// Driven Program
int main()
{
int arr[] = { 1, 2, 3 };
int n = sizeof(arr)/sizeof(arr[0]);
int m = 11;

cout << minTime(arr, n, m) << endl;

return 0;
}

Output:

6

Method 2 (efficient):

The idea is to use Binary Search. Maximum possible time required to produce m items will be maximum time in the array, amax, multiplied by m i.e amax * m. So, use binary search between 1 to amax * m and find the minimum time which produce m items.

Below is the C++ implementation of this approach:

// Efficient C++ program to find minimum time
// required to produce m items.
#include<bits/stdc++.h>
using namespace std;

// Return the number of items can be
// produced in temp sec.
int findItems(int arr[], int n, int temp)
{
int ans = 0;
for (int i = 0; i < n; i++)
ans += (temp/arr[i]);
return ans;
}

// Binary search to find minimum time required
// to produce M items.
int bs(int arr[], int n, int m, int high)
{
int low = 1;

// Doing binary search to find minimum
// time.
while (low < high)
{
// Finding the middle value.
int mid = (low+high)>>1;

// Calculate number of items to
// be produce in mid sec.
int itm = findItems(arr, n, mid);

// If items produce is less than
// required, set low = mid + 1.
if (itm < m)
low = mid+1;

//  Else set high = mid.
else
high = mid;
}

return high;
}

// Return the minimum time required to
// produce m items with given machine.
int minTime(int arr[], int n, int m)
{
int maxval = INT_MIN;

// Finding the maximum time in the array.
for (int i = 0; i < n; i++)
maxval = max(maxval, arr[i]);

return bs(arr, n, m, maxval*m);
}

// Driven Program
int main()
{
int arr[] = { 1, 2, 3 };
int n = sizeof(arr)/sizeof(arr[0]);
int m = 11;

cout << minTime(arr, n, m) << endl;

return 0;
}

Output:

6

This article is contributed by Anuj Chauhan. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

# GATE CS Corner    Company Wise Coding Practice

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.
2.8 Average Difficulty : 2.8/5.0
Based on 5 vote(s)

Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.