我們都大致知道二分查詢是怎樣的,大概就是取左右的中點與要查詢的值相比較,如果比中點小,那範圍就可以縮小到左邊了,瞬間去掉了一般的資料,那通過這個思想,首先我們來「猜」乙個值作為所要求的答案(最大化的最小值或最小化的最大值),也就是當作要查詢的值,假設他是正確答案,然後我們通過逐步的縮小範圍最後找到正確答案。
如果遇到題目要求最小的最大值或者使得最小值最大化,這個時候一般情況列舉很容易超時,這時我們就可以用二分搜尋的思想來解決問題。
我們通過這個題目來理解理解
建立火車站
輸入描述:第一行輸入城市個數n,可建立停靠站個數k, 第二行輸入n個城市的座標(不保證前乙個城市座標比後乙個城市小)。
輸出描述:示例1輸出l
輸入2 24 106
輸出34
1)遞迴寫法:
#include
#include
#define ll long long
using
namespace std;
ll a[
100005];
ll n,k,ans;
ll bs
(ll l,ll r)
if(sum>k)
return
bs(mid+
1,r)
;//需要塞的車站數比給的多,說明猜小了,所以範圍移到了更大的右半部分
return
bs(l,mid)
;//猜大了
}int main (
)
2)非遞迴寫法:
#include
#include
#define ll long long
using
namespace std;
const
int n=
1e5+5;
ll a[n]
;int n,m;
bool
check
(ll mid)
return
true
;//猜大了
}ll bsearch
(ll l,ll r)
return l;
}int
main()
openjudge 2456 aggressive cows
題目意思:農民約翰有用c隻牛,然後他有n個隔間,每個隔間都有自己的座標位置(一維的)pos,如何安排把牛安排進隔間才能使,所有牛之間距離的最小值最大,我們不需要求這個分配方案,我們只需要求這個最小距離的最大值,很裸的最小值最大化。
#include
"iostream"
#include
"algorithm"
#include
"cstdio"
using
namespace std;
const
int n =
1e5+10;
int a[n]
;int n, c;
bool
check
(int dis)}if
(cnt >= c)
return
true
;//大於說明可以放的牛多了,也就是「猜」的距離小了,範圍往右邊移
else
return
false;}
intbsearch
(int l,
int r)
else
}return ans;
}int
main()
sort
(a, a + n)
;/// 輸入的位置是無序的,先排序方便模擬檢驗
int l =
1, r = a[n -1]
- a[0]
;int ans =
bsearch
(l,r)
; cout << ans <<
"\n"
;return0;
}
二分搜尋 (最小值最大化和最大值最小化)
有一類常見問題叫做最小值最大化或者最大值最小化。這類問題一般是用二分搜尋來解決。首先二分搜尋解決的問題必須具備單調性這個性質,這是使用二分搜尋的必要條件,我們分析兩個問題。1.最小值最大化 我們假設x為最大的最小值,那麼x 1是滿足條件的,但他並不滿足最大,x 1是不滿足條件的,假設我們左邊界是l,...
二分搜尋的最大值最小化與最小值最大化
求最大值最小化 二分區間 l,r l max l,r 的區間根據題目所定,這邊寫的區間都是下面題目的區間 r sum 二分模板 while l求最小值最大化 二分區間 l,r l 0 l,r 的區間根據題目所定,這邊寫的區間都是下面題目的區間 r a n a 1 二分模板 while l最小值最大化...
二分查詢求最大值最小化(最小值最大化)問題
題目描述 這項比賽將在一條筆直的河道中進行,河道中分布著一些巨大岩石。組委會已經選擇好了兩塊岩石作為比賽起點和終點。在起點和終點之間,有 nn 塊岩石 不含起點和終點的岩石 在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。為了提高比賽難度,組委會計畫移走一些岩石,使得選手們在比...