基本思想在乙個區間內,二分邊界,找到乙個性質,使劃分的區域一邊滿足性質,一邊不滿足性質,每次選擇答案所在區間進行下一步處理,最終找到符合那個性質的數。
基本模板
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;
}
經典例題給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。**yxc acwing789.數的範圍
對於每個查詢,返回乙個元素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 定義對分查詢函式 ...