開學第九周 One(二分三分及其思想)

2021-09-19 15:41:49 字數 1090 閱讀 6610

明天就是運動會啦,平白多了兩天的假期,真好,可以放鬆一下,當然,題目也是不能放下的,正好也可以補補以前的坑。

搜尋專題也快結束了,我現在對bfs狀態的壓縮還是有些迷。第一次接觸覺得很神奇,靠乙個整型就可以列舉二三十種狀態,這也改變了我對位運算的看法,位運算真的叼。

老師又開了二分專題,由二分查詢引入二分思想,可以解決很多實際問題。

乙個問題讓你求某種最優(最大、最小),如果你發現這個問題的函式模型具有某種單調相關性的話,可以嘗試一下二分思想。

1.確定答案的最大值和最小值

2.判斷二分所得值是否滿足條件

3.可行解必須具有單調性(當k可行時,k+1可行或者k-1可行)

每次都要確保right和left有乙個被改變。

模板:

//可行解最大值問題

int l=minn,r=maxn;

int ans=-1;

while(l<=r)

else

r=mid-1;

}

查詢離散的數

//x:待查詢的元素,n:陣列集合大小,num:陣列單調遞增

int low=0,high=n,mid,res=-1;//low:集合下界 high:集合上界

while(low<=high)

else if(num[mid]查詢連續函式的寫法

//x:待查詢的值,caculate():所要查詢的函式,在這裡單調遞增

//需要保證查詢的值在區間範圍內

double low=「區間下界」,high=「區間上界」,mid;

while(high-low>1.0e-6)

{ mid=low+(high-low)/2;

if(caculate(mid)常見擴充套件

——對於某些問題,如果答案具有特定的範圍,並且驗證答案是否成立的函式具有單調性。則可以在範圍內對答案進行二分驗證,從而快速確定答案。

二分 三分模板

適用於 單調函式 單調增或單調減 基本思想 給定9個數,由小到大排列,從這9個數中找出某乙個確切的數 比如4 偽 int binary sreach int a,int left,int right,int x if a left x return left return 1 給你三個陣列a,b,c...

二分和三分

三分二分,乙個簡單而神奇的演算法,可以簡化時間複雜度,但是用二分有乙個條件,就是我們進行二分的序列必須有單調性。原理 aa中找乙個數x xx 保證x xx一定存在 我們可以用樸素演算法,直接從頭到尾找一遍,時間複雜度o n o n o n 如果當序列a aa的長度十分大時,這種方法就不好用了。二分橫...

二分和三分

二分 二分,即為折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。也就是說,二分的條件為必須滿足數列或某一邏輯的順序性,單調 只有這樣才能進行二分。查詢方法 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如...