http://www.lintcode.com/en/problem/wood-cut/
给定一组树木,要求切割任意次之后相同长度的树木个数大于等于k,求最长切割后的长度。如果没有满足条件的情况就返回-1.
二分最长树木,模板牛逼!考虑溢出
public class Solution {
/**
*@param L: Given n pieces of wood with length L[i]
*@param k: An integer
*return: The maximum length of the small pieces.
*/
public int woodCut(int[] L, int k) {
// write your code here
int max = 0;
// 考虑溢出情况
long sum = 0;
for (int l : L) {
sum += l;
max = Math.max(max, l);
}
if (sum < k) {
return 0;
}
int beg = 1;
int end = max;
// 叼炸天的二分模板,beg和end都不用进行加减运算!!!
while (beg + 1 < end) {
int mid = beg + (end - beg) / 2;
if (valid(mid, L, k)) {
beg = mid;
} else {
end = mid;
}
}
if (valid(beg, L, k)) {
return beg;
}
return end;
}
private boolean valid(int target, int[] lens, int k) {
int sum = 0;
int cnt = 0;
for (int l : lens) {
cnt += (l / target);
}
return cnt >= k;
}
}