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

2021-10-02 06:22:20 字數 1985 閱讀 4154

求最大值最小化

二分區間[l,r)

l=max(.

....

);//[l,r]的區間根據題目所定,這邊寫的區間都是下面題目的區間

r=sum(.

....

);二分模板

while

(l

求最小值最大化

二分區間(l,r]l=0

;//[l,r]的區間根據題目所定,這邊寫的區間都是下面題目的區間

r=a[n]

-a[1];

二分模板

while

(l

最小值最大化

題目描述

農夫約翰建造了一座有n間牛舍的小屋,牛舍排在一條直線上,第i間牛舍在xi的位置,但是約翰的m頭牛對小屋很不滿意,因此經常互相攻擊。約翰為了防止牛之間互相傷害,因此決定把每頭牛都放在離其它牛盡可能遠的牛舍。也就是要最大化最近的兩頭牛之間的距離。

牛們並不喜歡這種布局,而且幾頭牛放在乙個隔間裡,它們就要發生爭鬥。為了不讓牛互相傷害。john決定自己給牛分配隔間,使任意兩頭牛之間的最小距離盡可能的大,那麼,這個最大的最小距離是多少呢?

輸入第一行用空格分隔的兩個整數n和m;

第二行為n個用空格隔開的整數,表示位置xi。

輸出輸出僅乙個整數,表示最大的最小距離值。

樣例輸入 copy53

1284

9樣例輸出 copy3提示

把牛放在1,4

,8這樣最小距離是3

2≤n≤105

,0≤xi≤109

,2≤m≤n

**

#include

using

namespace std;

const

int n=

1e5+

100;

typedef

long

long ll;

ll a[n]

;int n,m;

intcheck

(int x)

if(cnt>=m)

return1;

return0;

}int

main()

cout<}

最大值最小化

題目描述

對於給定的乙個長度為n的正整數數列a,現要將其分成m段,並要求每段連續,且每段和的最大值最小。

例如,將數列424

51要分成3段:

若分為[42

][45

][1],各段的和分別為6,9

,1,和的最大值為9;

若分為[4]

[24]

[51],各段的和分別為4,6

,6,和的最大值為6;

並且無論如何分段,最大值不會小於6。

所以可以得到要將數列424

51要分成3段,每段和的最大值最小為6。

輸入第1行包含兩個正整數n,m;

第2行包含n個空格隔開的非負整數ai,含義如題目所述。

輸出僅包含乙個正整數,即每段和最大值最小為多少。

樣例輸入 copy53

4245

1樣例輸出 copy6提示

對於100

%的資料,有n≤106,m≤n,ai之和不超過109

**

#include

using

namespace std;

const

int n=

1e5+10;

int n,m;

int a[n]

;int

check

(int x)}if

(cnt>=m)

return0;

return1;

}int

main()

while

(lcout<}

二分搜尋 (最小值最大化和最大值最小化)

有一類常見問題叫做最小值最大化或者最大值最小化。這類問題一般是用二分搜尋來解決。首先二分搜尋解決的問題必須具備單調性這個性質,這是使用二分搜尋的必要條件,我們分析兩個問題。1.最小值最大化 我們假設x為最大的最小值,那麼x 1是滿足條件的,但他並不滿足最大,x 1是不滿足條件的,假設我們左邊界是l,...

二分 最小化最大值

注意答案的二分性質,必須要滿足在滿足給定條件的所有情況的時候都滿足要求才能更新ans。include using namespace std typedef long long ll inline ll in while c 0 c 9 res res 10 c 48,c getchar retur...

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

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