二分
基本思想
二分是对具有两段性问题的一种解决方式,通过不断缩小可行解的范围来解决问题。
二分可分为整数二分和浮点数二分,思想都大同小异。对于整数二分来说,二分的范围要是可行解的范围,而浮点数二分的初始范围一般不需要做限制。
代码模板
整数二分模板1
int l=0,r=n-1;//这里l,r对应可行解范围
while(l<r)
{
int mid=l+r>>1;
if(check(mid))r=mid;
else l=mid+1;
}
return r;
整数二分模板2
int l=0,r=n-1;// 这里的l,r对应可行解的范围
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid))l=mid;
else r=mid-1;
}
return r;
浮点数二分
double l=0,r=1e18;
while(r-l>1e-8)
{
double mid=(l+r)/2;
if(check(mid))r=mid;
else l=mid;
}
return r;
应用场景
求一个可行解(构造数组、可行区间范围)、或者最值问题(最大化最小值、最大化平均值等等)
具体题目: