整數二分和浮點數二分基本思路和模板

2021-10-17 08:38:14 字數 2734 閱讀 9244

————出自南昌理工學院acm集訓隊

二分,是從一系列有序對中找出某乙個符合條件的數,找到之後把這個數的位置給返回,

基本思想就是,我給你乙個資料範圍,打個比方1—200,我讓你猜我心中所想的那個數175,最基本的方法就是從頭到尾開始猜,是1嗎,不是,是2嗎,不是。。。,一直猜到答案為止,這樣猜的話,最壞的情況是要猜200次。

不過用二分來找就更為巧妙一點,你看,要從1—200內猜乙個數,那我們可以直接先取1—200的一半,就直接從100開始猜,我會告訴你小了,小了就直接再猜100—200的一半150,我又會告訴你小了,你就再可以從150—200中,取中間值175,這樣就猜對了。

現在讓我們來歸納一下二分基本思想:二分就是每次取資料範圍的一半,然後判斷一半這個點是否符合條件,然後來選擇是取這個點的上半部分還是下半部分,之後再取選擇完後的範圍再取中間點,以此迴圈,直到找到符合條件的答案為止。

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 個查詢。對於每個查詢,返回乙個元素k的起始位置和終止位置(位置從0開始計數)。如果陣列中不存在該元素,則返回「-1 -1」。

輸入格式

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

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

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

輸出格式

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

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

資料範圍

1≤n≤100000

1≤q≤10000

1≤k≤10000

輸入

6 3

1 2 2 3 3 434

5

輸出

3 4

5 5-1 -1

題意已經很清楚就是求乙個數的初始位置和終止位置。

**:

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

const

int n =

1e5+5;

intmain()

while

(m--)if

(a[l]

!= x)

else

cout << l << endl;}}

return0;

}

浮點數二分和整數二分不同,浮點數不存在由於(整數)取整導致的邊界問題,每次二分區間嚴格減半, 因此比整數二分簡單的多,每次更新邊界時直接讓r = mid或l = mid即可。

bool

check

(double x)

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

double

bsearch_3

(double l,

double r)

return l;

}

讓我們來看個例題

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

輸入格式

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

輸出格式

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

資料範圍

−10000≤n≤10000

輸入

1000.00

輸出

10.000000

**:

#include

#include

#include

#include

typedef

long

long ll;

using

namespace std;

const

int n =

1e5+5;

intmain()

double l =

0, r = n;

while

(r - l >

1e-8

)printf

("%lf"

, l)

;//保留六位小數

return0;

}

整數二分和浮點數二分

注意點 1.有單調性一定可以二分,二分不一定需要單調性 2.二分本質 找到一種性質,將乙個區間一分為二,一部分滿足性質,另一部分不滿足性質,通過二分找到兩部分的邊界 3.二分一定有解,即能夠找到性質的邊界。無解通常跟題目有關。4.浮點數二分 精度足夠小時結束迴圈 或者 直接迴圈100次 while ...

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

一定是單調的才可以二分。找中間點 判斷是否滿足check函式 此函式需要自己根據題意調整,假設紅色區域為滿足check函式,說明mid在紅色區域內,此時要在mid到r之間找,l mid,否則r mid 1。由於此時l mid 所以中間點應為 l r 1 2 中間點mid l r 2 mid l r ...

浮點數二分

2 浮點數二分 模板 浮點數二分演算法模板 模板題 acwing 790.數的三次方根 bool check double x double bsearch3 double l,double r return l acwing790.數的三次方根 給定乙個浮點數n,求它的三次方根。輸入格式 共一行,...