while(l<=r)
{
int mid=(l+r)/2;//min=l+(r-l)/2 防止数据溢出
if(check(mid))
l=mid+1;
else
r=mid-1;
}
//最大值最小答案是l,最小值最大答案是r

 

 

最小值最大化的二分区间是右闭左开(L,R],每次二分的中心为M=(L+R+1)/2;
while(L<R){
int M=(L+R+1)/2;
if(check(M)) L=M;
else R=M-1;
}
cout<<R<<endl;
最大值最小化的二分区间是左闭右开,[L,R),每次二分的中心为M=(L+R)/2
while(L<=R){
int M=(L+R)/2;
if(check(M)) R=M;
else L=M+1;
}
cout<<L<<endl;

发表评论

邮箱地址不会被公开。 必填项已用*标注