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