给定n本书,第i本书有[i]页。有k个人来抄这些书。
这些书排成一行,每个人都可以索取连续一段的书。例如,一个复印机可以连续地将书从第i册复制到第j册,但是他不能复制第1册、第2册和第4册(没有第3册)。
他们在同一时间开始抄书,每抄一页书都要花1分钟。为了让最慢的复印机能在最早的时间完成书的分配,最好的策略是什么?
请返回最慢复印机花费的最短时间。
二分法
书籍复印的时间范围为[页数最多的那本书,页数和]
对时间范围进行二分 判断mid时间k个人是否可以复印完成
若可以完成 说明时间可以更短 比这个长的时间可以删掉 反之同理
public class Solution {
/**
* @param pages: an array of integers
* @param k: An integer
* @return: an integer
*/
public int copyBooks(int[] pages, int k) {
int l = 0;
int r = Integer.MAX_VALUE;
while(l + 1 < r){
int mid =l + (r - l) / 2;
if(check(pages, mid, k)){
r = mid;
}
else{
l = mid;
}
}
if(check(pages, l, k))
return l;
return r;
}
private boolean check(int[] pages, int limit, int k){
int num = 0, left = 0;
for(int page : pages){
if(page > limit)
return false;
if(page > left){
num++;
left = limit;
}
left -= page;
}
return num <= k;
}
}