已經是第三次卡邊界了..日
你要求的是滿足條件的最小值, 所以當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#include#include#includeusing namespace std;
typedef long long ll;
//找12222233的左邊的2 ,取邊界時l=left;r=right+1;
int bsearch1(int l,int r)
return l;
}//找右邊2,取邊界是l=left-1;r=right;
int bsearch2(int l,int r)
return l;
} int main(void)
自己寫的二分查詢模板 2
關於二分查詢的型別以及變式不同寫法的關鍵 while迴圈條件是l r還是 l r 中值m靠左還是靠右 區間是左開右閉還是左右都閉 先貼上c 標準庫的寫法.public int lower bound int nums,int target,int l,int r return l 或者return ...
二分的模板(花式二分)
對於不下降序列a,n為序列a元素的個數,key為關鍵字 1.求最小的i,使得a i key,若不存在,則返回 1 int binary search 1 inta,intn int key if a r key returnr return 1 2.求最大的i,使得a i key,若不存在,則返回 ...
二分答案模板
include include 必須包含的標頭檔案 using namespace std int main int tmp upper bound point,point 5,7 point 按從小到大,7最多能插入陣列point的哪個位置 printf d n tmp tmp lower bou...