LintCode 木材加工

来源:互联网 发布:oracle rowid数据删重 编辑:程序博客网 时间:2024/05/15 18:50

问题描述:

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

样例:

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

本题要找到小段木头的最大长度,首先想到了从某个可能值递减,直到数组中每一个数除某一长度的商之和等于k,该长度为小段木头的最大长度。但是从哪个数字开始递减并不是那么容易判断。

首先肯定最大长度肯定<=数组中每一个数除k的商之和(sum)。具体一点,针对样例数组,232/7+124/7+456/7 = 115,大于最大长度。

但是,从115递减就足够了吗,答案是否定的。举个例子,数组为[3, 4, 7, 3, 7, 4, 7, 7, 7, 7, 5, 7, 7, 4, 7, 3, 7],k=8时,L[i]/8之和为0,但是最大长度为7,显然不对,针对这种情况,就应该从数组的最大值开始遍历。

因此, 应该从Math.max(sum, 数组元素最大值)开始递减。

代码如下:

public class Solution {    public int woodCut(int[] L, int k) {        int i = 0; int j = 0; int sum = 0; int max = 0; int  max0 = 0; int t = 0;        if (L == null || L.length == 0) {            return 0;        }        int []J = new int [L.length];        for (i = 0; i < L.length; i++) {            J[i] = L[i];            sum += L[i] / k;        }        for (i = 0; i < L.length - 1; i++) {            if (L[0] < L[i]) {                t = L[0];                 L[0] = L[i];                L[i] = t;            }        }        max0 = Math.max(sum, L[0]);        for (max = max0; max >= 1; max--) {            sum = 0;            for (i = 0; i < L.length; i++) {                sum += J[i] / max;            }            if (sum >= k) {                break;            }        }        return max;    }}


0 0