已經是第三次卡邊界了..日
你要求的是滿足條件的最小值, 所以當check滿足時,應該往左搜。比如求最大值的最小化,往左搜,用第一個板子——P1462 通往奧格瑞瑪的道路
如果要求滿足條件的最大值,所以當check滿足時,應該往右搜,比如求最小值的最大化,往右搜 —— 通信線路
然後邊界[left,right], l=left-1,r=right+1;在求解實際問題時,用l==right+1(二分的實際含義)來判斷無解的情況而不是用什麼dis[n]==0x3f3f3f3f(達不到這個點來判斷)[兩道題合計8小時的教訓];
2020/7/3上面的說法不對,在使用1號板子(r=mid),這個邊界開[1,n+1];在使用二號板子,這個邊界開[0,n]
然後去寫check函數,用bool返回值比較容易想清楚—— 裏面邏輯就是判斷mid這個值能不能滿足條件.如果滿足就true,不滿足就false;
如在p1462中,用的是第一個板子,然後check的時候,如果當前的mid滿足就true;那麼當前的mid怎麼算滿足呢,只要能走到就滿足,所以是dis[n]<=b就是滿足的
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
//找12222233的左邊的2 ,取邊界時l=left;r=right+1;
int bsearch1(int l,int r)
{
while(l<r)
{
int mid=(l+r)/2;
if(check[mid]) r=mid;
else l=mid+1;
}
return l;
}
//找右邊2,取邊界是l=left-1;r=right;
int bsearch2(int l,int r)
{
while(l<r)
{
int mid=(l+r+1)/2;
if(check[mid]) l=mid;
else r=mid-1;
}
return l;
}
int main(void)
{
return 0;
}