// C++ program to find minimum time to finish all jobs with
// given number of assignees
#include<bits/stdc++.h>
using namespace std;
// Utility function to get maximum element in job[0..n-1]
int getMax(int arr[], int n)
{
int result = arr[0];
for (int i=1; i<n; i++)
if (arr[i] > result)
result = arr[i];
return result;
}
// 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);
}
// Driver program
int main()
{
int job[] = {10, 15,4};
int n = sizeof(job)/sizeof(job[0]);
int k = 2, T = 5;
cout << findMinTime(k, T, job, n) << endl;
return 0;
}
Ly8gQysrIHByb2dyYW0gdG8gZmluZCBtaW5pbXVtIHRpbWUgdG8gZmluaXNoIGFsbCBqb2JzIHdpdGggCi8vIGdpdmVuIG51bWJlciBvZiBhc3NpZ25lZXMgCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+IAp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCi8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IG1heGltdW0gZWxlbWVudCBpbiBqb2JbMC4ubi0xXSAKaW50IGdldE1heChpbnQgYXJyW10sIGludCBuKSAKeyAKaW50IHJlc3VsdCA9IGFyclswXTsgCmZvciAoaW50IGk9MTsgaTxuOyBpKyspIAoJaWYgKGFycltpXSA+IHJlc3VsdCkgCgkJcmVzdWx0ID0gYXJyW2ldOyAKCXJldHVybiByZXN1bHQ7IAp9IAoKLy8gUmV0dXJucyB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGZpbmlzaCBqb2JzW10gd2l0aGluIAovLyBnaXZlbiB0aW1lICd0aW1lJyAKYm9vbCBpc1Bvc3NpYmxlKGludCB0aW1lLCBpbnQgSywgaW50IGpvYltdLCBpbnQgbikgCnsgCgkvLyBjbnQgaXMgY291bnQgb2YgY3VycmVudCBhc3NpZ25lZXMgcmVxdWlyZWQgZm9yIGpvYnMgCglpbnQgY250ID0gMTsgCgoJaW50IGN1cnJfdGltZSA9IDA7IC8vIHRpbWUgYXNzaWduZWQgdG8gY3VycmVudCBhc3NpZ25lZSAKCglmb3IgKGludCBpID0gMDsgaSA8IG47KSAKCXsgCgkJLy8gSWYgdGltZSBhc3NpZ25lZCB0byBjdXJyZW50IGFzc2lnbmVlIGV4Y2VlZHMgbWF4LCAKCQkvLyBpbmNyZW1lbnQgY291bnQgb2YgYXNzaWduZWVzLiAKCQlpZiAoY3Vycl90aW1lICsgam9iW2ldID4gdGltZSkgeyAKCQkJY3Vycl90aW1lID0gMDsgCgkJCWNudCsrOyAKCQl9IAoJCWVsc2UgeyAvLyBFbHNlIGFkZCB0aW1lIG9mIGpvYiB0byBjdXJyZW50IHRpbWUgYW5kIG1vdmUgCgkJCS8vIHRvIG5leHQgam9iLiAKCQkJY3Vycl90aW1lICs9IGpvYltpXTsgCgkJCWkrKzsgCgkJfSAKCX0gCgoJLy8gUmV0dXJucyB0cnVlIGlmIGNvdW50IGlzIHNtYWxsZXIgdGhhbiBrIAoJcmV0dXJuIChjbnQgPD0gSyk7IAp9IAoKLy8gUmV0dXJucyBtaW5pbXVtIHRpbWUgcmVxdWlyZWQgdG8gZmluaXNoIGdpdmVuIGFycmF5IG9mIGpvYnMgCi8vIGsgLS0+IG51bWJlciBvZiBhc3NpZ25lZXMgCi8vIFQgLS0+IFRpbWUgcmVxdWlyZWQgYnkgZXZlcnkgYXNzaWduZWUgdG8gZmluaXNoIDEgdW5pdCAKLy8gbSAtLT4gTnVtYmVyIG9mIGpvYnMgCmludCBmaW5kTWluVGltZShpbnQgSywgaW50IFQsIGludCBqb2JbXSwgaW50IG4pIAp7IAoJLy8gU2V0IHN0YXJ0IGFuZCBlbmQgZm9yIGJpbmFyeSBzZWFyY2ggCgkvLyBlbmQgcHJvdmlkZXMgYW4gdXBwZXIgbGltaXQgb24gdGltZSAKCWludCBlbmQgPSAwLCBzdGFydCA9IDA7IAoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIAoJCWVuZCArPSBqb2JbaV07IAoKCWludCBhbnMgPSBlbmQ7IC8vIEluaXRpYWxpemUgYW5zd2VyIAoKCS8vIEZpbmQgdGhlIGpvYiB0aGF0IHRha2VzIG1heGltdW0gdGltZSAKCWludCBqb2JfbWF4ID0gZ2V0TWF4KGpvYiwgbik7IAoKCS8vIERvIGJpbmFyeSBzZWFyY2ggZm9yIG1pbmltdW0gZmVhc2libGUgdGltZSAKCXdoaWxlIChzdGFydCA8PSBlbmQpIAoJeyAKCQlpbnQgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDI7IAoKCQkvLyBJZiBpdCBpcyBwb3NzaWJsZSB0byBmaW5pc2ggam9icyBpbiBtaWQgdGltZSAKCQlpZiAobWlkID49IGpvYl9tYXggJiYgaXNQb3NzaWJsZShtaWQsIEssIGpvYiwgbikpIAoJCXsgCgkJCWFucyA9IG1pbihhbnMsIG1pZCk7IC8vIFVwZGF0ZSBhbnN3ZXIgCgkJCWVuZCA9IG1pZCAtIDE7IAoJCX0gCgkJZWxzZQoJCQlzdGFydCA9IG1pZCArIDE7IAoJfSAKCglyZXR1cm4gKGFucyAqIFQpOyAKfSAKCi8vIERyaXZlciBwcm9ncmFtIAppbnQgbWFpbigpIAp7IAoJaW50IGpvYltdID0gezEwLCAxNSw0fTsgCglpbnQgbiA9IHNpemVvZihqb2IpL3NpemVvZihqb2JbMF0pOyAKCWludCBrID0gMiwgVCA9IDU7IAoJY291dCA8PCBmaW5kTWluVGltZShrLCBULCBqb2IsIG4pIDw8IGVuZGw7IAoJcmV0dXJuIDA7IAp9IAo=