二分就是其实就是不断二分查找答案的过程,将二分的区间分成两部分,一部分为满足条件的,一步分为不满足条件的。
对于答案是整数类型的问题
比如求满足x>=k的最小的x那么就要选l,求满足x>k的最小的x就要选r。其中r-1=l。
对于求满足x<=k的最大的x那么就要选r,求满足x<k的最大的x就要选l。其中r-1=l。
这个时候的solve函数通常写为
void solve(){
int l=左边界减一点,r=右边界加一点;
while(r-l>1){
int mid=(l+r)/2;
if(can(mid)) l=mid;
else r=mid;
}
//printf("%d\n",根据题意);
}
但是有的时候题中需要的是一个小数,这个时候循环结束的条件和输出结果也会略有不同。
void solve(){
double l=,r=;
for(int i=0;i<100;i++){//这里循环足够多的次数以保证精度
double mid=(l+r)/2;
if(can(mid)) l=mid;
else r=mid;
}
printf("%d\n",(int)(r*100 + 0.5));//由于这里的精度已经很高了,所以输出l和r的效果是一样的
}