二分

基本思想

二分是对具有两段性问题的一种解决方式,通过不断缩小可行解的范围来解决问题。
二分可分为整数二分和浮点数二分,思想都大同小异。对于整数二分来说,二分的范围要是可行解的范围,而浮点数二分的初始范围一般不需要做限制。

代码模板

整数二分模板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;

应用场景

求一个可行解(构造数组、可行区间范围)、或者最值问题(最大化最小值、最大化平均值等等)
具体题目:

posted @ 2021-03-12 11:53  冰糖ryj  阅读(206)  评论(0编辑  收藏  举报