题目:
题解:
对于这种求不超过mo次操作的最小球数,一般使用二分答案来做即可。
代码如下:
// 2022/4/3 新代码
class Solution {
public:
// 二分查找不超过mo次操作的最少袋子里面的球
int minimumSize(vector<int>& a, int mo) {
// 二分边界:下界为1,表示每个袋子装1个球;上界为max(a),表示每个袋子装最大值个球
int l=1,r=*max_element(a.begin(),a.end());
while(l<r){
int mid=(l+r)>>1;
int cnt=0;
// 每个元素x划分的次数为向上取整的商-1
for(int x:a)cnt+=(x+mid-1)/mid-1;
if(cnt<=mo)r=mid;// 划分次数不超过mo,表示每个袋子装mid个球满足条件,向左逼近寻找更小的mid
else l=mid+1;// 划分次数大于mo,表示mid太小导致划分次数太多,所以向右逼近寻找更大的mid
}
return l;
}
};