Description:
给出一个数组A包含n个元素,表示n本书以及各自的页数。现在有个k个人复印书籍,每个人只能复印连续一段编号的书,比如A[1],A[2]
由第一个人复印,但是不能A[1],A[3]
由第一个人复印,求最少需要的时间复印所有书。
Explanation:
A = [3,2,4]
,k = 2
返回5,第一个人复印前两本书
Solution:
二分法。考虑两种极端情况。1、只有一个人,那么总时长就是所有书籍之和。2、有无数的人,那么总时长就是所有书籍页数最多的那本。
然后开始二分法。取mid,要求每个工人的工作量不可以超过mid(limit),如果超过,则需要增加工人,计算所需的工人的总数,并和k比较,以此重新确定start和end。
注意while的边界是start+1 < end。一般情况下,start == end即可返回结果,但是
start | end | mid | workers | k |
4 | 9 | 6 | 2 | <=k |
4 | 6 | 5 | 2 | <=k |
4 | 5 | 4 | 3 | >k |
4 | 5 | 4 | 3 | >k |
public class Solution {
/**
* @param pages: an array of integers
* @param k: an integer
* @return: an integer
*/
public int copyBooks(int[] pages, int k) {
// write your code here
int[][] record = new int[pages.length][k];
for(int i = 0 ;i < pages.length;i++){
search()
}
}
public void search(int[] pages , int[][] record , int start , int row , int column){
if(start >= pages.length || row >= pages.length || column >= k) return;
int sum = 0;
for(int i = start;i<pages.length;i++){
sum += pages[i];
int[row][column] = sum;
search(pages , record , start + 1 , row , column + 1);
}
}
}