整數二分詳解

2021-10-21 17:22:04 字數 2232 閱讀 6220

在公升序、無重複元素的陣列中,查詢值為k的元素的陣列下標

#include

#include

#include

using

namespace std;

const

int n =10;

// 在給定陣列中查詢k值所在位置,若不存在則返回-1

// l為二分下界,r為二分上界

intbinarysearch

(int a,

int l,

int r,

int k)

else

if(a[mid]

> k)

else

}return-1

;}intmain()

;scanf

("%d"

,&k)

;// 此處傳入閉區間[0, n-1]

int pos =

binarysearch

(a,0

, n-

1, k)

;printf

("%d\n"

, pos)

;return0;

}

在公升序、有重複元素的陣列中,查詢第乙個大於等於k值的元素的陣列下標

#include

#include

#include

using

namespace std;

const

int n =6;

// 在給定陣列中查詢第乙個大於等於k值的元素的陣列下標

// 若該元素不存在,則返回假設它存在,應該在的位置

// l為二分下界,r為二分上界

intlowerboundl

(int a,

int l,

int r,

int k)

else

}// 此處返回r或l皆可,因為r == l

return l;

}int

main()

;while(~

scanf

("%d"

,&k)

)return0;

}

在公升序、有重複元素的陣列中,查詢最後乙個小於等於k值的元素的陣列下標

#include

#include

#include

using

namespace std;

const

int n =6;

// 在給定陣列中查詢最後乙個小於等於k值的元素的陣列下標

// 若該元素不存在,則返回下標0

// l為二分下界,r為二分上界

intlowerboundr

(int a,

int l,

int r,

int k)

else

}return l;

}int

main()

;while(~

scanf

("%d"

,&k)

)else

}return0;

}

使用模板二模板三可以在陣列中找到重複元素的區間

在公升序、有重複元素的陣列中,查詢第乙個大於k值的元素的陣列下標

#include

#include

#include

using

namespace std;

const

int n =6;

// 在給定陣列中查詢第乙個大於k值的元素的陣列下標

// 若該元素不存在,則返回假設它存在,應該在的位置

// l為二分下界,r為二分上界

intupperbound

(int a,

int l,

int r,

int k)

else

}return l;

}int

main()

;while(~

scanf

("%d"

,&k)

)return0;

}

待補充…

模版 整數二分

確定乙個區間,使得目標值一定在這個區間內 從題目中找到一種性質 根據上述的性質,具體可以把整數二分劃分為兩大類問題 第一類 目標值是前半段的右端點 將 l,r l,r l,r 分成 l,mid 1 l,mid 1 l,mid 1 和 mi d,r mid,r mid,r 如果mid midmi d處...

C Convoy(整數二分)

這道題我直接好傢伙,方法就是二分時間,看看最短時間符不符合。坑在於 1.需要判斷a i 是否等於0,不然有時候會re!2.需要注意司機無論多少趟只能帶乙個。因為回來的時候也需要乙個人開車。3.左右邊界盡量開到1e12。而且變數以防萬一都開long long,不然會超時。include using n...

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

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