M1760.袋子里最少数目的球
binary search, https://leetcode.cn/problems/minimum-limit-of-balls-in-a-bag/
思路:一开始的想法是将最多的一个袋子拆成 m + n 暴力回溯,显然太暴力了,后来看了题解,反向设置最终目标加二分法才是最合适的,用时约30分钟
cpp
class Solution
{
public:
int minimumSize(vector<int>& nums, int maxOperations)
{
int left = 1, right = *max_element(nums.begin(), nums.end());
int ans = 0;
while (left <= right)
{
int mid = (right + left) / 2;
long long op = 0;
for(int x : nums)
{
op += (x - 1) / mid;
}
if (op <= maxOperations)
{
ans = mid;
right = mid - 1;
}
else
left = mid + 1;
}
return ans;
}
};二分答案
cpp
class Solution {
public:
int minimumSize(vector<int>& nums, int maxOperations) {
int l = 1, r = *max_element(nums.begin(), nums.end());
int n = nums.size();
while (l <= r) {
int mid = l + (r - l) / 2;
long long tmp = 0;
for (int i = 0; i < n; i++) {
tmp += (nums[i] / mid - 1);
if (nums[i] % mid) tmp ++;
}
if (tmp <= maxOperations) r = mid - 1;
else l = mid + 1;
}
return l;
}
};