二分模板以及經典例題

2021-10-18 15:29:20 字數 2317 閱讀 3557

演算法思路:演算法思路:假設目標值在閉區間[l, r]中, 每次將區間長度縮小一半,當l = r時,我們就找到了目標值。

當我們將區間[l, r]劃分成[l, mid]和[mid + 1, r]時,其更新操作是r = mid或者l = mid + 1;,計算mid時不需要加1。

int

bsearch_1

(int l,

int r)

return l;

}

當我們將區間[l, r]劃分成[l, mid - 1]和[mid, r]時,其更新操作是r = mid - 1或者l = mid;,此時為了防止死迴圈,計算mid時需要加1。

int

bsearch_2

(int l,

int r)

return l;

}

如果是浮點數的話,題目中如果說保留到小數點第k位的話,改一下while條件為r-l<10^-(k+2),還有l=mid和r=mid的時候不用加1

while

(r-l>

1e-4

)

題目描述

有n根繩子,第i根繩子長度為li

,現在需要m根等長的繩子,你可以對n根繩子進行任意裁剪(不能拼接),請你幫忙計算出這m根繩子最長的長度是多少。

輸入格式

第一行包含2個正整數n、m,表示原始繩子的數量和需求繩子的數量。

第二行包含n個整數,其中第 i 個整數li

表示第 i 根繩子的長度。

輸出格式

輸出乙個數字,表示裁剪後最長的長度,保留兩位小數。

資料範圍

1≤n,m≤100000

,0輸入樣例:

3 43 5 4

輸出樣例:

2.50

樣例解釋

第一根和第三根分別裁剪出一根2.50長度的繩子,第二根剪成2根2.50長度的繩子,剛好4根。

思路這道題就是經典的二分,把求解問題轉換成了判定問題,依次列舉從0到1e9的所有符合條件盡可能大的浮點數就是所求的結果,用乙個check函式判定能不能劃分為m個,符合條件就令l=mid,再找更大的,二分結束就可以找到最大的浮點數值

**

#include

using namespace std;

int n,m;

int a[

100005];

bool check

(double mid)

intmain()

cout<<

"\n"

;printf

("%.2lf"

,r);

}

題目描述

兒童節那天有 k

位小朋友到小明家做客。

小明拿出了珍藏的巧克力招待小朋友們。

小明一共有 n

塊巧克力,其中第 i 塊是 hi×wi

的方格組成的長方形。

為了公平起見,小明需要從這 n

塊巧克力中切出 k

塊巧克力分給小朋友們。

切出的巧克力需要滿足:

形狀是正方形,邊長是整數

大小相同

例如一塊 6×5

的巧克力可以切出 6 塊 2×2 的巧克力或者 2 塊 3×3

的巧克力。

當然小朋友們都希望得到的巧克力盡可能大,你能幫小明計算出最大的邊長是多少麼?

輸入格式

第一行包含兩個整數 n

和 k以下 n

行每行包含兩個整數 hi 和 wi

輸入保證每位小朋友至少能獲得一塊 1×1

的巧克力。

輸出格式

輸出切出的正方形巧克力最大可能的邊長。

資料範圍

1≤n,k≤105

,1≤hi,wi≤105

輸入樣例:

2 10

6 55 6

輸出樣例:

思路就是用模板2就行了,直接上**

**

#include

using namespace std;

int n,m;

typedef pair<

int,

int> pii;

pii p[

100005];

bool check

(int mid)

return res>=m;

}int

main()

int l=

1,r=

1e5;

while

(lcout<}

二分查詢模板和例題

模板 int bsearch 1 int l,int r else return l 例題,位元組筆試題 給定n個猴子 每個猴子有個食量,每個猴子輪流拿香蕉,要求拿的數量為min remain 2,eat 2 且該數量 eat,其中remain是當前剩餘食物數量,eat是食量。最後乙個猴子可以全部拿...

二分法經典例題

三個例題語句大致相同,但是注意判斷語句中的符號有差異,請讀者慢慢體會.一 二 三 二分全部使用的是左閉右閉區間 一 運用範圍 查詢是否存在n元素 include int main int n scanf d n int mid int left 0 int right 4 while left ri...

二分和二分答案和三分(經典例題)

int find low int x for int i 1 i n i k 1 for int i 1 i n i sort y 1,y k 然後依次遍歷x,在y中二分查詢是否有 x存在 for int i 1 i 對於難以直接確定解的問題,採取二分列舉 檢驗的思想將求解類問題轉換為驗證類問題 k...