二分法及相關題

2021-10-09 08:47:41 字數 2297 閱讀 4295

2,浮點數二分法模板

bool

check

(int x)

// 檢查x是否滿足某種性質

// 區間[l, r]被劃分成[l, mid]和[mid + 1, r]時使用:

//適合情況:滿足該性質的範圍在右邊

intbsearch_1

(int l,

int r)

return l;

}// 區間[l, r]被劃分成[l, mid - 1]和[mid, r]時使用:

//適合情況:滿足該性質的範圍在左邊

277/

注:有單調性的序列一定可以二分,但是二分不一定要求單調性,二分的本質不是單調性。

二分的本質是,如果可以找到乙個性質,使得全部範圍的一部分滿足這個性質,另一部分不滿足,那麼二分法就可以用來尋找這個性質的邊界~

二分法一定可以找到解,無解的情況都與題目限制有關。

題目:

給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。對於每個查詢,返回乙個元素k的起始位置和終止位置(位置從0開始計數)。

如果陣列中不存在該元素,則返回「-1 -1」。

輸入格式

第一行包含整數n和q,表示陣列長度和詢問個數。

第二行包含n個整數(均在1~10000範圍內),表示完整陣列。

接下來q行,每行包含乙個整數k,表示乙個詢問元素。

輸出格式

共q行,每行包含兩個整數,表示所求元素的起始位置和終止位置。

如果陣列中不存在該元素,則返回「-1 -1」。

資料範圍

1≤n≤100000

1≤q≤10000

1≤k≤10000

輸入樣例:

6 31 2 2 3 3 434

5輸出樣例:

3 45 5

-1 -1

分析:

利用上面的模板,求出查詢數的左右兩個邊界

**:

#include

#include

#include

using

namespace std;

const

int n =

100010

;int n, q;

int p[n]

;int

main()

if(p[l]

!= k) cout <<

"-1 -1"

<< endl;

else

cout << l << endl;}}

return0;

}

bool

check

(double x)

// 檢查x是否滿足某種性質

double

bsearch_3

(double l,

double r)

return l;

}

浮點數二分比整數二分簡單一些,沒什麼邊界值,套模板做就 ok

題目:

給定乙個浮點數n,求它的三次方根。

輸入格式

共一行,包含乙個浮點數n。

輸出格式

共一行,包含乙個浮點數,表示問題的解。注意,結果保留6位小數。

資料範圍

−10000≤n≤10000

輸入樣例:

1000.00

輸出樣例:

10.000000

**如下:

#include

using

namespace std;

intmain()

printf

("%lf"

,l);

return0;

}

二分法及相關擴充套件

二分法是演算法中的基礎,今天用python語言來總結一下,有錯誤的地方希望能被指出。二分法查詢某數是否存在 def b sit arr,num arr為陣列,num為目標數 if len arr 0 return false l 0 r len arr 1 m 0 while l r m l r l...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...