所需知识:二分
思路:
由于巧克力最大边长范围为 [1,n],将此范围二分,在答案左边的数全部满足每个小朋友分得相同的巧克力,反之则不成立,构造一个Check函数判断每个mid是否合法;
长度为X,宽度为Y的巧克力最多可以分成边长为mid的个数:(X/mid)*(Y/mid);
将所有巧克力能分成的数量累加,若大于小朋友的数量则成立,反之不成立;
最后注意二分的代码实现不要写成死循环!!!
C++代码:
#include<iostream>
using namespace std;
typedef long long ll;
const ll n=100005;
ll N,K;
ll H[n],W[n];
bool solve(int mid){
ll sum=0;
for(int i=1;i<=N;i++){
sum+=((H[i]/mid)*(W[i]/mid));
}
if(sum<K)
return false;
return true;
}
int main()
{
cin>>N>>K;
for(int i=1;i<=N;i++){
cin>>H[i]>>W[i];
}
int l=1,r=n;
while(l<r){
int mid=(l+r+1)>>1;
if(solve(mid))l=mid;
else
r=mid-1;
}
cout<<r;
return 0;
}