二分答案
就是缩小上界和下界的范围,取中间点作为答案(把答案作为已知条件),看该答案是否满足要求。
模板:
二分整数答案
int L,R;//上界和下界
while(L<=R){//有时候可能是L+1 < R,看情况
int mid=(L+R)/2;
if(OK(mid))R=mid-1;
else L=mid+1;
}
printf("%d",L);
二分实数答案
double L,R;
while(R-L>=eps){//eps一定要比要求的精度更高(最好高个5、6位,如果时间允许)
double mid=(L+R)/2;
if(OK(mid))R=mid;
else L=mid;
}
printf("%lf",L);
注意
一般,题目中出现了“最小的最大”“最大的最小”,都可以用二分答案解决。
题解传送门
NKOI3600 河中跳房子游戏