http://www.lintcode.com/en/problem/copy-books/
有n本書,每本pages[i]頁,一個工人一分鐘複製一頁,一共k個工人,每個工人分到的書號必須連續,求怎樣分最後一個工人結束時間最早
解析:
這個其實就是抽象成問題,一個數組分爲k個子數組,保證最大子數組和最小
解法一:
二分查找,解一定位於[max, sum]之間。count可能返回的是res + 1,因爲最後一個子數組沒記錄進去
public class Solution {
public int copyBooks(int[] pages, int k) {
// write your code here
if (pages.length == 0) {
return 0;
}
int max = Integer.MIN_VALUE;
int sum = 0;
for (int p : pages) {
max = Math.max(max, p);
sum += p;
}
while (max + 1 < sum) {
int mid = max + (sum - max) / 2;
if (count(pages, mid) <= k) {
sum = mid;
} else {
max = mid;
}
}
if (count(pages, max) <= k) {
return max;
}
return sum;
}
private int count(int[] pages, int limit) {
int sum = 0;
int res = 0;
for (int p : pages) {
if (sum + p > limit) {
sum = 0;
res++;
}
sum += p;
}
return sum == 0 ? res : res + 1;
}
}
解法二:
DP,時間複雜度比較高,可查詢網上
http://jane4532.blogspot.jp/2015/07/lintcode-copy-books.html