大三下每日打卡029

二分

又单调性的话,一定可以二分,没有单调性的也能二分。把整个区间一分为2,一半满足一半不满足,就可以用二分把这个边界点二分出来,一共有两种情况,根据mid是在左边还是右边来定的;l=mid 的时候要加一,r=mid的时候不加一,男左女右。

mid = (l+ r +1)/2 此时mid在数轴左边

if(check(mid)) 是true的话 区间就算[mid , r], 更新方式 l = mid; 是false的话 区间是[l,mid-1],更新方式 r = mid -1

//区间[l,r]被划分成[mid,r]和[l,mid-1]时使用
int bsearch_2(int l ,int r)
{
   while(l < r)
  {
       int mid = l + r + 1 >> 1;
       if(check(mid)) l = mid;
       else r = mid -1;
  }
   return l;
}

mid = (l + r )/2 此时mid在数轴右边

if(check(mid)) 是true的话 区间就算[l , mid], 更新方式 r = mid; 是false的话 区间是[mid+1,r],更新方式 l = mid + 1

//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用
int bsearch_1(int l , int r)
{
   while(l < r)
  {
       int mid = l +r >> 1;
       if(check(mid)) r = mid;
       else l = mid + 1;
  }
   return l;
}
 
posted @ 2025-04-03 08:06  软件拓荒人  阅读(12)  评论(0)    收藏  举报