二分
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
vector<vector<int>> op(n, vector<int>(2));
int max_num = 0;
int min_num = 1e5+1;
for(int i = 0; i < n; i++){
for(int j = 0; j < 2; j++){
scanf("%d", &op[i][j]);
max_num = max(max_num, op[i][j]);
}
}
auto check = [&](int d){
int res = 0;
for(int i = 0; i < n; i++){
int a = op[i][0] / d;
int b = op[i][1] / d;
res += a*b;
}
return res >= k;
};
int left = 1;
int right = max_num;
int mid;
int max;
while(left <= right){
mid = (left + right) >> 1;
//如果够分,则要尽可能切更大块
if(check(mid)){
left = mid + 1;
max = mid;
}
else{
right = mid - 1;
}
}
cout << max;
return 0;
}
使用二分法,令下界为1,令上界为巧克力的最大值。这里需要注意的就是在二分的时候,我们要定义一个max来记录满足check的最大的数是多少,如果最后直接返回mid的话,可能会导致即使该mid不满足check函数为true的情况下被返回。