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
- LintCode-木材加工
- LintCode 木材加工
- lintcode-木材加工-183
- lintcode 木材加工
- LintCode 木材加工
- LintCode : 木材加工
- LintCode 183 木材加工
- LintCode : 木材加工
- Lintcode 木材加工
- 木材加工-LintCode
- 木材加工
- 木材加工
- 木材加工
- 木材加工
- wikioi 3297 木材加工
- [POJ2774]木材加工
- OpenJugde - 2774:木材加工
- OpenJudge 2774 木材加工
- Poj 3187 Backward Digit Sums【暴力+排列组合】
- 杭电1204
- Hadoop - 更换节点ip 地址之后(虚拟机中的伪分布模式,学习format)
- WebService概述(转载)
- 怎么用C语言编 电影院售票系统
- LintCode 木材加工
- LeetCode--234. Palindrome Linked List
- Android spinner三级连动菜单实现核心代码
- Linux 下的 ~是什么意思
- hdu 1018 Big Number
- Android动画解析(一)—— Frame Animation(帧动画)
- 查找算法3
- leetcode:Single Number 【Java】
- Android中圆形图片转换