[LintCode]Wood Cut

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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值