LintCode : 木材加工

LintCode : 木材加工

题目

有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。

样例

有3根木头[232, 124, 456], k=7, 最大长度为114.

思路

首先我们先找到可能的最大长度,也就是所有木头长度的总和除最小段。然后我们用二分查找去寻找满足k的最大长度。因为要求最大长度,所以可能会有不同的长度满足相同的小段数。所以我们的判停条件为minlen < maxlen。同时因为设置的maxlen是满足最小段大于k的所以二分的时候midlen = (minlen + maxlen + 1)/ 2而不是(minlen + maxlen)/ 2,不知道有没有小伙伴会像我一样犯这样的错误,所以先写在这,具体代码如下(对了,因为求和的缘故,所以中间变量使用long long防止溢出)。

代码

int woodCut(vector<int> L, int k) {
    long long alllen = 0;
    for(long long i = 0; i < L.size(); i++) {
        alllen += L[i];
    }
    long long maxlen = alllen / k;
    long long minlen = 0; 
    while(minlen < maxlen) {
        if(maxlen == 0) {
            return 0;
        }
        long long midlen = (minlen + maxlen + 1) / 2;
        long long segment = 0;
        for(long long i = 0; i < L.size(); i++) {
            segment += L[i] / midlen;
        }
        if(segment >= k && minlen != midlen) {
            minlen = midlen;
        }
        else {
            maxlen = midlen - 1;
        }
    }
    return minlen;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值