题解:二分查找
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
//巧克力块数
int n = 0;
//小朋友的人数
int K = 0;
cin>>n;
cin>>K;
//使用两个数组分别存储巧克力的高和宽
vector<int> H_vec(n);
vector<int> W_vec(n);
for(int i = 0;i<n;i++){
cin>>H_vec[i]>>W_vec[i];
}
//最长的高和最长的宽
int H_maxValue = *max_element(H_vec.begin(),H_vec.end());
int W_maxValue = *max_element(W_vec.begin(),W_vec.end());
//得到理论最大边长
int academy_sl = min(H_maxValue,W_maxValue);
//所分得的块数
int sum = 0;
//二分法搜寻
int left = 0;
int right = academy_sl-1;
while(left<right){
// (right-left+1)>>1 等同于 (right-left+1)/2
int middle = (right + left + 1)/2;
sum = 0;
for(int num = 0;num<n;num++){
//开始循环遍历
sum+= int(H_vec[num]/(middle+1))*int(W_vec[num]/(middle+1));
}
//所得总块数是否大于k
if(sum>=K){
left = middle;
}else{
//小于 边长需要再小一点
right = middle-1;
}
}
//输出结果 输出满足条件的最右元素 即 最大边长
cout<<right+1;
return 0;
}