LintCode 木材加工
2015-10-08 21:19
405 查看
木材加工
有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。
样例
有3根木头[232, 124, 456], k=7, 最大长度为114.
注意
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0 即可。
挑战
O(n log Len), Len为 n 段原木中最大的长度
solution: 题目的意思就是把n根木头至少切割成K断长长度为len的小段木头,并且要保证len越长越好,因此len的最大的可能值为maxLen = max1→nL[i]\max_{1 \to n}{L[i]}。因此 1≤len≤maxLen1 \le len \le maxLen 。
方法一:蛮力法, 时间复杂度为O(n∗maxLen)O(n*maxLen)
方法二:二分法,时间复杂度O(nlog(maxLen))O(nlog(maxLen))
有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为 k。当然,我们希望得到的小段越长越好,你需要计算能够得到的小段木头的最大长度。
样例
有3根木头[232, 124, 456], k=7, 最大长度为114.
注意
木头长度的单位是厘米。原木的长度都是正整数,我们要求切割得到的小段木头的长度也要求是整数。无法切出要求至少 k 段的,则返回 0 即可。
挑战
O(n log Len), Len为 n 段原木中最大的长度
solution: 题目的意思就是把n根木头至少切割成K断长长度为len的小段木头,并且要保证len越长越好,因此len的最大的可能值为maxLen = max1→nL[i]\max_{1 \to n}{L[i]}。因此 1≤len≤maxLen1 \le len \le maxLen 。
方法一:蛮力法, 时间复杂度为O(n∗maxLen)O(n*maxLen)
class Solution { public: /** *@param L: Given n pieces of wood with length L[i] *@param k: An integer *return: The maximum length of the small pieces. */ int woodCut(vector<int> L, int k) { int maxLen = 1; for (const auto &elem : L) maxLen = max(maxLen, elem); for (int len = maxLen; len >= 1; --len) { if (getCount(L, len) >= k) return len; } return 0; } private: int getCount(vector<int> L, int len) { int sum = 0; for (const auto &elem : L) sum += elem / len; return sum; } };
方法二:二分法,时间复杂度O(nlog(maxLen))O(nlog(maxLen))
class Solution { public: /** *@param L: Given n pieces of wood with length L[i] *@param k: An integer *return: The maximum length of the small pieces. */ int woodCut(vector<int> L, int k) { // write your code here int last = 1, first = 1, mid; for (const auto &elem : L) { last = max(last, elem); } while (first + 1< last) { int mid = first + (last - first) / 2; if (getCount(L, mid) >= k) first = mid; else last = mid; } return getCount(L, last) >= k ? last : getCount(L, first) >= k ? first : 0; } private: int getCount(vector<int> L, int len) { int sum = 0; for (const auto &elem : L) sum += elem / len; return sum; } };
相关文章推荐
- eclipse下工程导成jar包运行报错,解决方法
- 我用KDE的N个理由
- Dropbox的一些服务
- NSCopying和NSMutableCopying协议
- java的浮点的精度、无穷大、无穷小、和非数
- 10月风怒(2)
- Android:Material Design(七) 兼容性
- Ubuntu装机
- MyEclipse问题收集
- c++中为什么用Send()或send()发送数据时要多发送至少一个字节
- HDU 2586
- 服务器端如何判断客户端是不是手机
- 剑指offer—构建乘积数组
- ocp-220
- Android常用辅助类(二)——设备相关
- Unity3D中用VS2012打开C#代码的设置
- ocp-219
- Android 孵化之路(一)——搭建开发环境
- ocp-218
- ocp-217