分石子
最优解
看到要使得最小值最大,则想到二分答案。
二分这个最小值,现在判断是否可以分出m份大于等于这个最小值的石堆。直接枚举每一堆石子然后看能分出几堆满足条件的石堆即可。
二分次数上界为,每次检查的复杂度为
,总的时间复杂度
只使用了常数个临时变量,空间复杂度
int solve(int n, long long m, vector<int> &a){
assert(a.size() == n);
int l = 1, r = 1e9;
for(int i = 0; i < n; ++i) r = min(r, a[i]);
int ans = 1;
while(l <= r){
int mid = (r+l)/2;
long long sum = 0;
for(int i = 0; i < n; ++i) sum += a[i]/mid;
if(sum < m) r = mid-1;
else ans = mid, l = mid+1;
}return ans;
}