木材加工(LintCode)
木材加工
有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。
有3根木头[232, 124, 456], k=7, 最大长度为114.
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0 即可。
O(n log Len), Len为 n 段原木中最大的长度
要达到n*log Len ,可以想到的是用折半查找。需要注意的是不一定要将所有的木头都切了,过短的木头可以不切(一开始我认为所有的木头都需要切,或者说最后的长度不能超过最短的木头,于是拿到了一个WA)。第一次遍历数组,求和并求得最大值。若和小于k,则返回0.接下来在1—max之间用折半查找,找到最大的长度。
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) {
if (L.length == 0) {
return 0;
}
long sum = L[0];
long max = L[0];
for (int i=1;i<L.length;i++) {
sum += L[i];
max = Math.max(L[i],max);
}
if (sum < k) {
return 0;
}
long i = 1;
long j = max;
while(i <= j) {
long mid = (i + j) / 2;
if (judge(L,k,mid)) {
i = mid + 1;
}else {
j = mid - 1;
}
}
return (int)j;
}
public boolean judge(int[] L,int k,long l){
int num = 0;
for (int x : L) {
num += x/l;
}
if (num >= k) {
return true;
}
return false;
}
}
木材加工(LintCode)的更多相关文章
- [LintCode]——目录
Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...
- (lintcode全部题目解答之)九章算法之算法班题目全解(附容易犯的错误)
--------------------------------------------------------------- 本文使用方法:所有题目,只需要把标题输入lintcode就能找到.主要是 ...
- Lintcode 85. 在二叉查找树中插入节点
-------------------------------------------- AC代码: /** * Definition of TreeNode: * public class Tree ...
- Lintcode 166. 主元素
----------------------------------- Moore's voting algorithm算法:从一个集合中找出出现次数半数以上的元素,每次从集合中去掉一对不同的数,当剩 ...
- Lintcode 166. 链表倒数第n个节点
----------------------------------- 最开始的想法是先计算出链表的长度length,然后再从头走 length-n 步即是需要的位置了. AC代码: /** * De ...
- Lintcode 157. 判断字符串是否没有重复字符
------------------------ 因为字符究竟是什么样的无法确定(比如编码之类的),恐怕是没办法假设使用多大空间(位.数组)来标记出现次数的,集合应该可以但感觉会严重拖慢速度... 还 ...
- Lintcode 175. 翻转二叉树
-------------------- 递归那么好为什么不用递归啊...我才不会被你骗...(其实是因为用惯了递归啰嗦的循环反倒不会写了...o(╯□╰)o) AC代码: /** * Definit ...
- Lintcode 372. O(1)时间复杂度删除链表节点
----------------------------------- AC代码: /** * Definition for ListNode. * public class ListNode { * ...
- Lintcode 469. 等价二叉树
----------------------------------------------- AC代码: /** * Definition of TreeNode: * public class T ...
随机推荐
- Windows下自动解压windows share上的文件
rem mkdir c:\buildmd c:\build rem Mount the Windows share to Z drivenet use x: \\172.16.10.240\Infa_ ...
- 【Foreign】数据结构C [线段树]
数据结构C Time Limit: 20 Sec Memory Limit: 512 MB Description Input Output Sample Input Sample Output H ...
- JS之document例题讲解1(两张表之间数据转移、日期时间选择、子菜单下拉、用div做下拉菜单、事件总结)
作业一:两个列表之间数据从一个列表移动到另一个列表 <div style="width:600px; height:500px; margin-top:20px"> & ...
- CSS animation怎么使用?(山东数漫江湖)
animation可以为很多CSS属性添加动画,比如: color, background-color, height和width.animation的动画需要使用@keyframes来定义,随后被a ...
- HDU 1175 连连看 (深搜+剪枝)
题目链接 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以 ...
- HDU 1422 重温世界杯 (dp)
题目链接 Problem Description 世界杯结束了,意大利人连本带利的收回了法国人6年前欠他们的债,捧起了大力神杯,成就了4星意大利. 世界杯虽然结束了,但是这界世界杯给我们还是留下许多值 ...
- ASP.NET MVC各个版本区别
ASP.NET MVC 1 view接收用户输入,把命令传到controller controller处理命令,更新model model被更新后,会通知view需要update view更新后向用户 ...
- bzoj 3450 DP
首先我们设len[i]表示前i位,从第i位往前拓展,期望有多少个'o',那么比较容易的转移 len[i]=len[i-1]+1 s[i]='o' len[i]=0 s[i]='x' len[i]=(l ...
- Tomcat的安装以及基本配置
Tomcat是目前最常见也是最流行的基于java的一个web服务器软件 Tomcat的安装 (1)首先需要java环境,也就是说要依赖于java虚拟机JVM (2)下载Tomcat ,地址 ...
- Linux汇编教程02:编写第一个汇编程序
学习一门语言,最好的方式就是在运用中学习,那么在这一章节中,我们开始编写我们的第一个汇编程序.当然作为第一个程序,其实十分的简单,但可以给大家一个基本的轮廓,了解汇编大概是这样的. 我们这个程序实际上 ...