AC代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010; ///一定注意数组范围
int n,k;
int h[N],w[N];
int check(int mid){
int cnt=0;
for(int i=0;i<n;++i){
cnt+=(h[i]/mid)*(w[i]/mid);
}
if(cnt>=k)
return 0;
else return 1;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;++i){
scanf("%d %d",&h[i],&w[i]);
}
int l=1,r=1e5,mid;
while(l<r){
mid=(l+r+1)/2; ///向上取整
if(check(mid)==0) ///成立就往右找
l=mid;
else ///不成立往左找
r=mid-1;
}
cout<<l<<endl;
return 0;
}
总结
整型二分和浮点二分区别在于,浮点二分是考虑精度而整型二分是考虑边界条件
整型二分有两种常见形式:(变动原则就是要跨越区间,以防死循环)
形式一:mid分在右边,用向上取整,r的变动为r = mid-1(此题)
while(l<r){
mid=(l+r+1)/2; ///向上取整
if(check(mid)) ///成立就往右找
l=mid;
else ///不成立往左找
r=mid-1;
}
形式二:mid分在左边,用向下取整,l的变动为l = mid+1
while(l<r){
mid=(l+r)/2; ///向上取整
if(check(mid)) ///成立就往右找
l=mid+1;
else ///不成立往左找
r=mid;
}
相关题目
AcWing 789. 数的范围
AcWing 22. 旋转数组的最小数字,不具有单调性,但具有二段性
AcWing 113. 特殊排序,没有单调性,但可以二分