一定是單調的才可以二分。
找中間點
判斷是否滿足check函式(),此函式需要自己根據題意調整,假設紅色區域為滿足check函式,說明mid在紅色區域內,此時要在mid到r之間找,l=mid,否則r=mid-1。
由於此時l=mid 所以中間點應為(l+r+1)/2
中間點mid
=(l+
r)/2
mid=(l+r)/ 2
mid=(l
+r)/
2 如果mid滿足check函式,比如說綠色區域,此時更新區間為l到mid 即r = mid ,否則 l = mid + 1。
注意::如何選擇模板,我們可以先看check函式滿足時,如果更新區間時l=mid 此時需要將中心點(l+r+1)/2。所以選擇模板一嘍!
為什麼要l+r+1呢 對於mid=(l+r)/2這個等式,如果l=r-1,即區間只有兩個數,此時mid=l,更新完l=mid時陷入迴圈。
給定乙個按照公升序排列的長度為n的整數陣列,以及 q 個查詢。
對於每個查詢,返回乙個元素k的起始位置和終止位置(位置從0開始計數)。
如果陣列中不存在該元素,則返回「-1 -1」。
輸入格式
第一行包含整數n和q,表示陣列長度和詢問個數。
第二行包含n個整數(均在1~10000範圍內),表示完整陣列。
接下來q行,每行包含乙個整數k,表示乙個詢問元素。
輸出格式
共q行,每行包含兩個整數,表示所求元素的起始位置和終止位置。
如果陣列中不存在該元素,則返回「-1 -1」。
資料範圍
1≤n≤1000001≤n≤100000
1≤q≤100001≤q≤10000
1≤k≤100001≤k≤10000
輸入樣例:
6 3
1 2 2 3 3 434
5
輸出樣例:
3 4
5 5-1 -1
首先我們從122334裡面找3,我們讓mid=(l+r)/2=0+5)/2=2,q[mid]=2如果我讓check函式為小於等於3即q[mid]<=3,左邊區域不滿足,此時在右邊尋找,此時l=mid 用模版一。
#include#includeusing namespace std;
const int n=1e5+10;
int a[n];
int main()
if(a[l]!=k) cout<<"-1 -1"<>1;
if(a[mid]<=k)l=mid;
else r=mid-1;
}cout《浮點數的模板比較簡單,以乙個題說明(數的三次方根)
給定乙個浮點數n,求它的三次方根。
輸入格式
共一行,包含乙個浮點數n。
輸出格式
共一行,包含乙個浮點數,表示問題的解。
注意,結果保留6位小數。
資料範圍
−10000≤n≤10000−10000≤n≤10000
輸入樣例:
1000.00
輸出樣例:
10.000000
#include #include using namespace std;
int main()
printf("%.6lf\n",l);
return 0;
}
說明:當r-l足夠小時,我們就假定已經找完,用公式表示為r−l
>1e
−6
r-l>1e-6
r−l>1e
−6,此時有個精度問題如果要求保留六位小數則r−l
>1e
−8
r-l>1e-8
r−l>1e
−8,總要比保留的位數多兩位。
整數二分和浮點數二分
注意點 1.有單調性一定可以二分,二分不一定需要單調性 2.二分本質 找到一種性質,將乙個區間一分為二,一部分滿足性質,另一部分不滿足性質,通過二分找到兩部分的邊界 3.二分一定有解,即能夠找到性質的邊界。無解通常跟題目有關。4.浮點數二分 精度足夠小時結束迴圈 或者 直接迴圈100次 while ...
浮點數二分
2 浮點數二分 模板 浮點數二分演算法模板 模板題 acwing 790.數的三次方根 bool check double x double bsearch3 double l,double r return l acwing790.數的三次方根 給定乙個浮點數n,求它的三次方根。輸入格式 共一行,...
整數二分和浮點數二分基本思路和模板
出自南昌理工學院acm集訓隊 二分,是從一系列有序對中找出某乙個符合條件的數,找到之後把這個數的位置給返回,基本思想就是,我給你乙個資料範圍,打個比方1 200,我讓你猜我心中所想的那個數175,最基本的方法就是從頭到尾開始猜,是1嗎,不是,是2嗎,不是。一直猜到答案為止,這樣猜的話,最壞的情況是要...