对于二分问题首先确定二分什么, 不难发现,这题是对巧克力的边长二分,
//对于分巧克力问题 我们可以对巧克力最大边长进行二分 然后判断是否每个人都能分到巧克力
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int h[N], w[N];
int n, k, hmax, wmax, Max;
bool check(int x)
{
int num=0;
for(int i=0;i<n;i++) //第i块巧克力
//切出边长为x的巧克力 长h[i] 宽w[i]
num += (h[i] / x) * (w[i] / x);
if(num >= k)//画出太多 边可以更长
return true;
return false; //太少 边可以更短
}
int main()
{
cin >> n >> k;
for(int i = 0; i < n; i ++)
{
cin >> h[i] >> w[i];
hmax = max(hmax, h[i]);
wmax = max(wmax, w[i]);
}
Max = min(hmax, wmax); //得到最大正方形巧克力边长的上界
int l = 1, r = Max;
while(l < r)
{
int mid = (l + r + 1) / 2;
if(check(mid))l = mid;
else r = mid - 1;
}
cout << r << '\n';
}