给定n本书,第i本书有[i]页。有k个人来抄这些书。
这些书排成一行,每个人都可以索取连续一段的书。例如,一个复印机可以连续地将书从第i册复制到第j册,但是他不能复制第1册、第2册和第4册(没有第3册)。
他们在同一时间开始抄书,每抄一页书都要花1分钟。为了让最慢的复印机能在最早的时间完成书的分配,最好的策略是什么?
请返回最慢复印机花费的最短时间。
class Solution {
public:
/**
* @param pages: an array of integers
* @param k: An integer
* @return: an integer
*/
//花x分钟,得用多少个人才能复印完
int check(vector<int> &pages, int x) {
int num = 1, y = x;
for (int i = 0; i < pages.size(); ++i) {
if (y >= pages[i]) {
y -= pages[i];
}
else {
y = x;
y -= pages[i];
num++;
}
}
return num;
}
int copyBooks(vector<int> &pages, int k) {
// write your code here
int l = 0;
long long r = 3e9;
for (int i = 0; i < pages.size(); ++i) {
l = max(l, pages[i]);
}
//在单调递增的序列中找到第一个大于等于k的数
while (l + 1 < r) {
int mid = (l + r ) / 2;
//需要的人数大于k,mid太小了
//需要找到第一个小于等于k的
int x = check(pages, mid);
if (x > k) {
l = mid;
}
else if (x <= k){
r = mid;
}
}
if (check(pages,l) <= k) {
return l;
}
return r;
}
};