给定一个整数数组 ribbons 和一个整数 k,数组每项 ribbons[i] 表示第 i 条绳子的长度。
对于每条绳子,你可以将任意切割成一系列长度为正整数的部分,或者选择不进行切割。
例如,如果给你一条长度为 4 的绳子,你可以:
你的任务是最终得到 k 条完全一样的绳子,他们的长度均为相同的正整数。 如果绳子切割后有剩余,你可以直接舍弃掉多余的部分。
对于这 k 根绳子,返回你能得到的绳子最大长度; 如果你无法得到 k 根相同长度的绳子,返回 0。
示例 1:
输入: ribbons = [9,7,5], k = 3
输出: 5
解释:
- 把第一条绳子切成两部分,一条长度为 5,一条长度为 4;
- 把第二条绳子切成两部分,一条长度为 5,一条长度为 2;
- 第三条绳子不进行切割;
现在,你得到了 3 条长度为 5 的绳子。
示例 2:
输入: ribbons = [7,5,9], k = 4
输出: 4
解释:
- 把第一条绳子切成两部分,一条长度为 4,一条长度为 3;
- 把第二条绳子切成两部分,一条长度为 4,一条长度为 1;
- 把第二条绳子切成三部分,一条长度为 4,一条长度为 4,还有一条长度为 1;
现在,你得到了 4 条长度为 4 的绳子。
示例 3:
输入: ribbons = [5,7,9], k = 22
输出: 0
解释: 由于绳子长度需要为正整数,你无法得到 22 条长度相同的绳子。
提示:
1 <= ribbons.length <= 10^5
1 <= ribbons[i] <= 10^5
1 <= k <= 10^9
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/cutting-ribbons 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int maxLength(vector<int>& ribbons, int k) {
int l = 1, r = 1e5, len, ans = 0;
while(l <= r)
{
len = (l+r)>>1;
if(ok(ribbons, len, k))
{
l = len+1;
ans = len;
}
else
r = len-1;
}
return ans;
}
bool ok(vector<int>& ribbons, int len, int k)
{
int ct = 0;
for(auto r : ribbons)
{
ct += r/len;
if(ct >= k)
return true;
}
return false;
}
};
152 ms 90.3 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!