NC382. 切割木头
描述
示例1
输入:
[1,2,3,4,5],3
输出:
3
示例2
输入:
[1,2,3,4,5],5
输出:
2
示例3
输入:
[1,2,3,4,5],7
输出:
1
C++ 解法, 执行用时: 7ms, 内存消耗: 828KB, 提交时间: 2022-05-19
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param k int整型 * @return int整型 */ int cutWood(vector<int>& a, int k) { // write code here sort(a.begin(), a.end(), greater<int>()); auto check = [&](int v) { int ans = 0; for (auto &i : a) { ans += i / v; if (ans >= k) { return true; } } return false; }; int l = 1, r = a[0]; while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; else r = mid - 1; } return r; } };
C++ 解法, 执行用时: 7ms, 内存消耗: 828KB, 提交时间: 2022-05-16
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param k int整型 * @return int整型 */ int cutWood(vector<int>& a, int k) { int maxNum = 0; for (auto &val : a) { maxNum = max(maxNum, val); } int res = 0; int left = 1, right = maxNum; while (left <= right) { int mid = (left + right) / 2; int count = 0; for (int i = 0; i < a.size(); i++) { count += a[i] / mid; } if (count >= k) { left = mid + 1; res = mid; } else { right = mid - 1; } } return res; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 792KB, 提交时间: 2022-07-02
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param k int整型 * @return int整型 */ int cutWood(vector<int>& a, int k) { // write code here sort(a.begin(),a.end()); int left=1,right=a.back(); while(left<right) { int mid=left + (right - left + 1) / 2; int ans=help(a,mid); if(ans>=k) { left=mid; } else { right=mid-1; } } return left; } int help(vector<int> a,int mid) { int cnt=0; for(int i=a.size()-1;i>=0;i--) { if(a[i]<mid) break; cnt+=(a[i]/mid); } return cnt; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 796KB, 提交时间: 2022-08-06
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param k int整型 * @return int整型 */ int get_max(std::vector<int>& a, int len) { int res = 0; for(auto& t : a) { res += (t / len); } return res; } int cutWood(vector<int>& a, int k) { // write code here int l = 1, r = *max_element(a.begin(), a.end()); while(l <= r) { int len = l + (r - l) / 2; int num = get_max(a, len); if(num >= k) l = len + 1; else r = len - 1; } return r; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 804KB, 提交时间: 2022-07-18
class Solution { public: int cutWood(vector<int>& a, int k) { sort(a.begin(), a.end(), greater<int>()); auto c = [&](int v) { int y = 0; for (auto& i : a) { y += i / v; if (y >= k) { return true; } } return false; }; int l = 1, r = a[0]; while (l < r) { int z = l + r + 1 >> 1; if (c(z)) l = z; else r = z - 1; } return r; } };