思路: 小巧克力边长 a 一定在 1 – 100000 之间 答案即为:在 1 – 100000 之间找到一个最大的数,使得所有的 (w[i]/a) * (h[i]/a) 之和大于要求的数量 k。
使用二分法找到 a 的最大取值即为答案。
# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;
const int N = 100010;
int n,k;
int h[N],w[N];
bool check(int mid)//判断条件
{
int res = 0;//记录分成长度为mid的巧克力数量
for(int i = 0;i < n;i++)
{
res += (h[i] / mid) * (w[i] / mid);//每块巧克力分出的数量
if(res >= k)//大于要求数量
{
return true;
}
}
return false;
}
int main()
{
scanf("%d %d",&n,&k);
for(int i = 0;i < n;i++)
{
scanf("%d %d",&h[i],&w[i]);
}
int l = 1,r = 1e5;
while(l < r)//二分查找
{
int mid = (l + r + 1) / 2;
if(check(mid))
{
l = mid;
}
else
{
r = mid - 1;
}
}
printf("%d\n",r);
return 0;
}