AcWing 1227. 分巧克力
原题链接
简单
作者:
牛奶小柒Luke
,
2021-03-23 20:44:17
,
所有人可见
,
阅读 270
典型整数二分问题
把面积看做是一个整体
找一个区间[l,r],表示最大边长的取值范围
判断条件是否成立,因为边长随着人数的增多而递减,具有单调性,且具有二段性;并且答案在改二段性的分界点
当mid成立时,答案可能在右区间,故l = mid更新区间
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 1e5 + 10;
int n,m;
int h[N],w[N];
bool check(int mid){
int res = 0;
for(int i = 0;i < n;++i){
res += (h[i] / mid) * (w[i] / mid);
if(res >= m) return true;
}
return false;
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 0;i < n;++i) scanf("%d%d",&h[i],&w[i]);
int l = 0,r = 1e5;
while(l < r){
int mid = l + r + 1 >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
}
cout << l << endl;
return 0;
}