將一段數列分成不超過
m m
的段,使得每段的最小的最大值
一般看到最小……最大……什麼的基本都用二分
因為最大值要盡量小,所以資料必然具有單調性,所以我們可以通過二分最大值(即最終答案)來求解。中間加上判斷即可
#include
using
namespace
std;int l,r,mid,a[100001],s,n,m;
inline
bool check(register
int sum)//判斷
return j>n;//看到最後能否滿足條件
}signed main()
printf("%d",r+1);//因為r每次都為mid-1,且本題一定有解,故輸出mid,即r+1
}
洛谷P1182 數列分段(二分 貪心)
題目描述 對於給定的乙個長度為n的正整數數列 a a 1 n 現要將其分成 mm m leq nm n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列 4 2 4 5 14 2 4 5 1 要分成 33 段。將其如下分段 4 2 4 5 1 4 2 4 5 1 第一段和為 66...
洛谷 P1182 數列分段
這是一道典型的二分答案問題 最大值最小,最小值最大 關鍵是對於細節的處理。二分的框架 l max,r sum while l r else l m 1 cout 二分的框架是普遍使用的,關鍵是檢驗函式的設計,此處的檢驗函式的含義為 是否存在一種合法的劃分,使得每段的最大值都不大於m。設計好了檢驗函式...
洛谷P1182數列分段
對於給定的乙個長度為n的正整數數列a i 現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4 2 4 5 1要分成3段 將其如下分段 4 2 4 5 1 第一段和為6,第2段和為9,第3段和為1,和最大值為9。將其如下分段 4 2 4 5 1 第一段和為4...