二分(C語言)

2021-10-07 20:07:03 字數 2536 閱讀 4709

基本思想

在乙個區間內,二分邊界,找到乙個性質,使劃分的區域一邊滿足性質,一邊不滿足性質,每次選擇答案所在區間進行下一步處理,最終找到符合那個性質的數。

基本模板

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]時使用:

intbsearch_2

(int l,

int r)

return l;

}

經典例題

**yxc acwing789.數的範圍

給定乙個按照公升序排列的長度為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

輸入樣例:

631

2233

4345

輸出樣例:

345

5-1-

1

解題思路

題目中的條件為給定乙個按照公升序排列的長度為n的整數陣列

先將區間[l, r]被劃分成[l, mid]和[mid + 1, r]使用,求出x從左到右最先所在的位置

然後將區間[l, r]被劃分成[l, mid - 1]和[mid, r]使用,求出x從右到左最先所在的位置

考慮區間[l,r] 中不存在x的情況

注意當l= mid 時,mid = l + r + 1 >> 1

當r =mid時,mid = l + r >> 1

#include

#include

#define n 100010

int n,m;

int q[n]

;int

main()

if(q[l]

!= x)

printf

("-1 -1\n");

//沒有找到x

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

else

printf

("%d\n"

, l);}

}return0;

}

基本模板

bool check

(double x)

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

double

bsearch_3

(double l,

double r)

return l;

}

經典例題

**於790. 數的三次方根

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

輸入格式

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

輸出格式

共一行,包含乙個浮點數,表示問題的解。

注意,結果保留6位小數。

資料範圍

−10000≤n≤10000

輸入樣例:

1000.00
輸出樣例:

10.000000
解題思路

找到對應的性質,例如大於等於x的三次方根,按區間的中間值mid將區間分為兩段,選擇包含有該性質的區間,繼續以中間值劃分,知道區間的長度區於零。

解題步驟

1、確定區間 l = -10000, r = 10000;

2、利用while迴圈直到含有該性質的區間區域零

3、取區間中點mid為分界點

4、判斷x的三次方根位於mid的左側還是右側,從而選擇相應的區間

#include

#include

intmain()

printf

("%lf"

,l);

return0;

}

c 語言 二分搜尋

題目描述 在有序序列中查詢某一元素x。輸入首先輸入乙個正整數n n 100000 表示該序列有n個整數,然後按從小到大的順序輸入n個整數 接著是乙個正整數m,表示有m次查詢 最後是m個整數,表示m個要查詢的整數x。輸出對於每一次查詢,有一行輸出。若序列中存在要查詢的元素x,則輸出元素x在序列中的序號...

C語言 二分查詢

二分查詢有序陣列中查詢具體某個數 條件 陣列為有序陣列 公升序或降序 查詢的思想 在有序陣列中查詢具體某個數,如果有,輸出該數所對應的下標 如果沒有,輸出未找到.具體思想 若為公升序排列的陣列,取陣列中間元素與待查詢的數比較,若待查詢的數小於中間元素,則在陣列左半部分查詢 若待查詢的數大於中間元素,...

二分查詢(C語言描述)

二分查詢是比較簡單的一種搜尋方式,但是它必須基於乙個已排序的陣列,換句話說的話,也就是二分查詢是需要乙個比較來判斷是往哪一方縮小查詢區間 建議查詢益於比較的資料 例如數字 上 對分查詢 includeint binarysearch const int a,int x,int n 定義對分查詢函式 ...