题目描述
思路
先模拟,计算边长取区间中点时,所有的巧克力能够分割的最大个数
- 如果能够分割的最大个数大于等于k,那么说明边长取小了,这个时候中点及其右边的区间是可取的
- 如果能够分割的最大个数小于k,说明边长取大了,中点左边的区间是可取的
初始的区间左端点是1,右端点是最大的边即可
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define maxlen 100009
int hi[maxlen];
int wi[maxlen];
int main()
{
int n, k;
cin>>n>>k;
int l=1; int r=INT_MIN; int size;
for(int i=0; i<n; i++)
{
cin>>hi[i]>>wi[i];
r = max(r, max(hi[i], wi[i]));
}
while(l<r)
{
size = l+(r-l)/2+1;
int cnt = 0;
for(int i=0; i<n; i++)
cnt += (hi[i]/size )*(wi[i]/size);
if(cnt>=k)
l = size;
else
r = size-1;
}
cout<<l<<endl;
return 0;
}