二分搜尋求最小化的最大值 最大化的最小值

2021-10-18 23:00:36 字數 2204 閱讀 5175

我們都大致知道二分查詢是怎樣的,大概就是取左右的中點與要查詢的值相比較,如果比中點小,那範圍就可以縮小到左邊了,瞬間去掉了一般的資料,那通過這個思想,首先我們來「猜」乙個值作為所要求的答案(最大化的最小值或最小化的最大值),也就是當作要查詢的值,假設他是正確答案,然後我們通過逐步的縮小範圍最後找到正確答案。

如果遇到題目要求最小的最大值或者使得最小值最大化,這個時候一般情況列舉很容易超時,這時我們就可以用二分搜尋的思想來解決問題。

我們通過這個題目來理解理解

建立火車站

輸入描述:

第一行輸入城市個數n,可建立停靠站個數k, 第二行輸入n個城市的座標(不保證前乙個城市座標比後乙個城市小)。

輸出描述:

輸出l

示例1

輸入

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 塊岩石 不含起點和終點的岩石 在比賽過程中,選手們將從起點出發,每一步跳向相鄰的岩石,直至到達終點。為了提高比賽難度,組委會計畫移走一些岩石,使得選手們在比...