LintCode - Copy Books
Find minimum time to finish all jobs with given constraints - GeeksforGeeks
Given an array of jobs with different time requirements. There are K identical assignees available and we are also given how much time an assignee takes to do one unit of job. Find the minimum time to finish all jobs with following constraints.
Read full article from Find minimum time to finish all jobs with given constraints - GeeksforGeeks
Find minimum time to finish all jobs with given constraints - GeeksforGeeks
Given an array of jobs with different time requirements. There are K identical assignees available and we are also given how much time an assignee takes to do one unit of job. Find the minimum time to finish all jobs with following constraints.
- An assignee can be assigned only contiguous jobs. For example, an assignee cannot be assigned jobs 1 and 3, but not 2.
- Two assignees cannot share (or co-assigned) a job, i.e., a job cannot be partially assigned to one assignee and partially to other.
K: Number of assignees available. T: Time taken by an assignee to finish one unit of job job[]: An array that represents time requirements of different jobs.
Input: k = 4, T = 5, job[] = {10, 7, 8, 12, 6, 8} Output: 75 We get this time by assigning {10} {7, 8} {12} and {7, 8}
The idea is to use Binary Search. Think if we have a function (say isPossible()) that tells us if it’s possible to finish all jobs within a given time and number of available assignees. We can solve this problem by doing a binary search for the answer. If middle point of binary search is not possible, then search in second half, else search in first half. Lower bound for Binary Search for minimum time can be set as 0. The upper bound can be obtained by adding all given job times.
Now how to implement isPossible()? This function can be implemented using Greedy Approach. Since we want to know if it is possible to finish all jobs within a given time, we traverse through all jobs and keep assigning jobs to current assignee one by one while a job can be assigned within the given time limit. When time taken by current assignee exceeds the given time, create a new assignee and start assigning jobs to it. If number of assignees become more than k, then return false, else return true.
// Returns true if it is possible to finish jobs[] within
// given time 'time'
bool
isPossible(
int
time
,
int
K,
int
job[],
int
n)
{
// cnt is count of current assignees required for jobs
int
cnt = 1;
int
curr_time = 0;
// time assigned to current assignee
for
(
int
i = 0; i < n;)
{
// If time assigned to current assignee exceeds max,
// increment count of assignees.
if
(curr_time + job[i] >
time
) {
curr_time = 0;
cnt++;
}
else
{
// Else add time of job to current time and move
// to next job.
curr_time += job[i];
i++;
}
}
// Returns true if count is smaller than k
return
(cnt <= K);
}
// Returns minimum time required to finish given array of jobs
// k --> number of assignees
// T --> Time required by every assignee to finish 1 unit
// m --> Number of jobs
int
findMinTime(
int
K,
int
T,
int
job[],
int
n)
{
// Set start and end for binary search
// end provides an upper limit on time
int
end = 0, start = 0;
for
(
int
i = 0; i < n; ++i)
end += job[i];
int
ans = end;
// Initialize answer
// Find the job that takes maximum time
int
job_max = getMax(job, n);
// Do binary search for minimum feasible time
while
(start <= end)
{
int
mid = (start + end) / 2;
// If it is possible to finish jobs in mid time
if
(mid >= job_max && isPossible(mid, K, job, n))
{
ans = min(ans, mid);
// Update answer
end = mid - 1;
}
else
start = mid + 1;
}
return
(ans * T);
}