时间复杂度O(n*logn)
//分巧克力
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
int n; //n块巧克力
int k; //k个小朋友
int h[N]; //长
int w[N]; //宽
bool check(int border){
int cnt = 0;
//统计每块巧克力可以分多少块
for (int i = 0;i < n;i++){
cnt += (h[i] / border)* (w[i] / border);
}
return cnt >= k;
}
int main (){ //时间复杂度O(nlogn)
//对边长进行二分
//ans因为是要尽可能大的 , 并且每个小朋友都要有巧克力
//如果边长大于ans 则会有小朋友没有巧克力
//边长小于等于ans则一定够分
cin >> n >> k;
int maxH = 0; //最长的边
for (int i = 0;i < n;i++){
int a = 0;
int b = 0;
cin >> a >> b;
maxH = max(maxH , a);
maxH = max(maxH , b);
h[i] = a;
w[i] = b;
}
int l = 0;
int r = maxH;
//对边长进行二分
while(l < r){
int mid = l + r + 1 >> 1;
if (check(mid)){
//true说明这个边是可以的
l = mid;
}
else //说明这个边会有小朋友不够分
r = mid - 1;
}
cout << l << endl;
return 0;
}