二分 整數二分和浮點數二分

2021-09-24 04:41:20 字數 2218 閱讀 1334

一定是單調的才可以二分。

找中間點

判斷是否滿足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嗎,不是。一直猜到答案為止,這樣猜的話,最壞的情況是要...