Minimum time required to produce m items
Last Updated :
12 Sep, 2023
Consider n machines that produce the same type of items but at different rates i.e., machine 1 takes a1 sec to produce an item, and machine 2 takes a2 sec to produce an item. Given an array that contains the time required by the ith machine to produce an item. Considering all machines are working simultaneously, the task is to find the 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
Method 1 : (Brute Force)
Initialize time = 0 and increment it by 1. Calculate the number of items produced at each time until the number of produced items is not equal to m.
Below is the implementation of the above idea :
C++
#include<bits/stdc++.h>
using namespace std;
int minTime( int arr[], int n, int m)
{
int t = 0;
while (1)
{
int items = 0;
for ( int i = 0; i < n; i++)
items += (t / arr[i]);
if (items >= m)
return t;
t++;
}
}
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;
}
|
Java
import java.io.*;
public class GFG{
static int minTime( int []arr, int n,
int m)
{
int t = 0 ;
while ( true )
{
int items = 0 ;
for ( int i = 0 ; i < n; i++)
items += (t / arr[i]);
if (items >= m)
return t;
t++;
}
}
static public void main (String[] args)
{
int []arr = { 1 , 2 , 3 };
int n = arr.length;
int m = 11 ;
System.out.println(minTime(arr, n, m));
}
}
|
Python3
import math as mt
def minTime(arr, n, m):
t = 0
while ( 1 ):
items = 0
for i in range (n):
items + = (t / / arr[i])
if (items > = m):
return t
t + = 1
arr = [ 1 , 2 , 3 ]
n = len (arr)
m = 11
print (minTime(arr, n, m) )
|
C#
using System;
public class GFG{
static int minTime( int []arr, int n,
int m)
{
int t = 0;
while ( true )
{
int items = 0;
for ( int i = 0; i < n; i++)
items += (t / arr[i]);
if (items >= m)
return t;
t++;
}
}
static public void Main (String []args)
{
int []arr = {1, 2, 3};
int n = arr.Length;
int m = 11;
Console.WriteLine(minTime(arr, n, m));
}
}
|
PHP
<?php
function minTime( $arr , $n , $m )
{
$t = 0;
while (1)
{
$items = 0;
for ( $i = 0; $i < $n ; $i ++)
$items += ( $t / $arr [ $i ]);
if ( $items >= $m )
return $t ;
$t ++;
}
}
$arr = array (1, 2, 3);
$n = count ( $arr );
$m = 11;
echo minTime( $arr , $n , $m );
?>
|
Javascript
<script>
function minTime(arr, n, m)
{
let t = 0;
while ( true )
{
let items = 0;
for (let i = 0; i < n; i++)
items += (t / arr[i]);
if (items >= m)
return t;
t++;
}
}
let arr = [ 1, 2, 3 ];
let n = arr.length;
let m = 11;
document.write(minTime(arr, n, m));
</script>
|
Time Complexity: O(n*m), it may vary for many test cases.
Space Complexity: O(1).
Method 2 (efficient):
The idea is to use Binary Search. The maximum possible time required to produce m items will be the 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 produces m items.
Below is the implementation of the above idea :
C++
#include<bits/stdc++.h>
using namespace std;
int findItems( int arr[], int n, int temp)
{
int ans = 0;
for ( int i = 0; i < n; i++)
ans += (temp/arr[i]);
return ans;
}
int bs( int arr[], int n, int m, int high)
{
int low = 1;
while (low < high)
{
int mid = (low+high)>>1;
int itm = findItems(arr, n, mid);
if (itm < m)
low = mid+1;
else
high = mid;
}
return high;
}
int minTime( int arr[], int n, int m)
{
int maxval = INT_MIN;
for ( int i = 0; i < n; i++)
maxval = max(maxval, arr[i]);
return bs(arr, n, m, maxval*m);
}
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;
}
|
Java
import java.io.*;
public class GFG{
static int findItems( int []arr, int n,
int temp)
{
int ans = 0 ;
for ( int i = 0 ; i < n; i++)
ans += (temp / arr[i]);
return ans;
}
static int bs( int []arr, int n,
int m, int high)
{
int low = 1 ;
while (low < high)
{
int mid = (low + high) >> 1 ;
int itm = findItems(arr, n, mid);
if (itm < m)
low = mid + 1 ;
else
high = mid;
}
return high;
}
static int minTime( int []arr, int n,
int m)
{
int maxval = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++)
maxval = Math.max(maxval, arr[i]);
return bs(arr, n, m, maxval * m);
}
static public void main (String[] args)
{
int []arr = { 1 , 2 , 3 };
int n = arr.length;
int m = 11 ;
System.out.println(minTime(arr, n, m));
}
}
|
Python3
import sys
def findItems(arr, n, temp):
ans = 0
for i in range (n):
ans + = temp / / arr[i]
return ans
def bs(arr, n, m, high):
low = 1
while low < high:
mid = (low + high) >> 1
itm = findItems(arr, n, mid)
if itm < m:
low = mid + 1
else :
high = mid
return high
def minTime(arr, n, m):
maxval = - sys.maxsize
for i in range (n):
maxval = max (maxval, arr[i])
return bs(arr, n, m, maxval * m)
if __name__ = = "__main__" :
arr = [ 1 , 2 , 3 ]
n = len (arr)
m = 11
print (minTime(arr, n, m))
|
C#
using System;
public class GFG{
static int findItems( int []arr, int n,
int temp)
{
int ans = 0;
for ( int i = 0; i < n; i++)
ans += (temp / arr[i]);
return ans;
}
static int bs( int []arr, int n,
int m, int high)
{
int low = 1;
while (low < high)
{
int mid = (low + high) >> 1;
int itm = findItems(arr, n, mid);
if (itm < m)
low = mid + 1;
else
high = mid;
}
return high;
}
static int minTime( int []arr, int n,
int m)
{
int maxval = int .MinValue;
for ( int i = 0; i < n; i++)
maxval = Math.Max(maxval, arr[i]);
return bs(arr, n, m, maxval * m);
}
static public void Main ()
{
int []arr = {1, 2, 3};
int n = arr.Length;
int m = 11;
Console.WriteLine(minTime(arr, n, m));
}
}
|
PHP
<?php
function findItems( $arr , $n , $temp )
{
$ans = 0;
for ( $i = 0; $i < $n ; $i ++)
$ans += ( $temp / $arr [ $i ]);
return $ans ;
}
function bs( $arr , $n , $m , $high )
{
$low = 1;
while ( $low < $high )
{
$mid = ( $low + $high ) >> 1;
$itm = findItems( $arr , $n , $mid );
if ( $itm < $m )
$low = $mid + 1;
else
$high = $mid ;
}
return $high ;
}
function minTime( $arr , $n , $m )
{
$maxval = PHP_INT_MIN;
for ( $i = 0; $i < $n ; $i ++)
$maxval = max( $maxval , $arr [ $i ]);
return bs( $arr , $n , $m , $maxval * $m );
}
$arr = array (1, 2, 3);
$n = count ( $arr );
$m = 11;
echo minTime( $arr , $n , $m );
?>
|
Javascript
<script>
function findItems(arr,n,temp)
{
let ans = 0;
for (let i = 0; i < n; i++)
ans += Math.floor(temp / arr[i]);
return ans;
}
function bs(arr,n,m,high)
{
let low = 1;
while (low < high)
{
let mid = (low + high) >> 1;
let itm = findItems(arr, n, mid);
if (itm < m)
low = mid + 1;
else
high = mid;
}
return high;
}
function minTime(arr,n,m)
{
let maxval = Number.MIN_VALUE;
for (let i = 0; i < n; i++)
maxval = Math.max(maxval, arr[i]);
return bs(arr, n, m, maxval * m);
}
let arr=[1, 2, 3];
let n = arr.length;
let m = 11;
document.write(minTime(arr, n, m));
</script>
|
Time Complexity : O(N * log M)
Auxiliary Space : O(1)
Share your thoughts in the comments
Please Login to comment...