整数二分的常见题型:
1.最大值的最小值
2.最小值的最大值
3.某个区间中的最大值或最小值
步骤:
1.确定答案所在的区间 注意如最大值的最小值:则答案的前提是最大值!所以找最大值的答案区间
2.二分查找满足条件的答案,check(mid):有时会结合贪心
最大值的最小值二分模版:
while(l<r){
int mid=(l+r)>>1;
if(check(mid)){
r=mid;
}else{
l=mid+1;
}
}
最小值的最大值二分模版:
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid)){
l=mid;
}else{
r=mid-1;
}
}
题目:
洛谷:P1678 p2678 p2249
p2440 p3853 p1182 p1163 p3743
实数二分模版:
1、确定实数二分的区间
2、求出double mid=(l+r)/2; while(r-l>1e-5)
3、判断check(mid):
if(刚好mid满足答案):cout<<mid;
else if(.....):l=mid;
else{
r=mid;
}