演算法思路:演算法思路:假設目標值在閉區間[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...