P1182 數列分段 SECTION II

2021-10-07 21:22:16 字數 1324 閱讀 3706

對於給定的乙個長度為n的正整數數列 a_a1∼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,第 22 段和為 99,第 33 段和為 11,和最大值為 99。

將其如下分段:

[4][2\ 4][5\ 1][4][2 4][5 1]

第一段和為 44,第 22 段和為 66,第 33 段和為 66,和最大值為 66。

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

所以可以得到要將數列 4\ 2\ 4\ 5\ 14 2 4 5 1 要分成 33 段,每段和的最大值最小為 66。

第 11 行包含兩個正整數 n,mn,m。

第 22 行包含 nn 個空格隔開的非負整數 a_ia

i​,含義如題目所述。

乙個正整數,即每段和最大值最小為多少。

輸入 #1複製

5 3

4 2 4 5 1

輸出 #1複製

6
對於 20\%20% 的資料,n\leq 10n≤10。

對於 40\%40% 的資料,n\leq 1000n≤1000。

對於 100\%100% 的資料,1\leq n\leq 10^51≤n≤105,m\leq nm≤n,a_i < 10^8ai​<108, 答案不超過 10^9109。

注:判斷的時候如果列舉的最大和比乙個元素的值小,那麼這個沒法分段,說明列舉的和小了,要變大 ;這題我覺得迷的是邊界..感覺是m#include#include#include#includeusing namespace std;

const int maxn=1e5+10;

typedef long ll;

ll a[maxn];

ll n,m;

//把n個數分成m組,每組區間和<=mid,是否可行

ll check(ll mid)

} }if(m<=cnt) return 0; //

else return 1;

}ll bsearch(ll l,ll r)

return l;

}int main(void)

//列舉每段最大和

ll t=bsearch(1,total+1);

if(t==total+1)

else cout

}

P1182 數列分段Section II

二分答案 確定左邊界和右邊界後找中間值,驗證該值是不是不滿足 要找到滿足中最小的那個 不如說是找到不能滿足的最大的那個 1 主要是怎麼寫好judge函式。將數列在保證分段和不超過mid的情況下 盡可能使得段數最少 如果最少段數超過了m,說明滿足最大值最小的 ans 一定比該二分答案大,也就是說mid...

P1182 數列分段 Section II

對於給定的乙個長度為n的正整數數列a ia i,現要將其分成m m n m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4 2 4 5 142451要分成33段 將其如下分段 4 2 4 5 1 42 45 1 第一段和為66,第22段和為99,第33段和為11,和最...

P1182 數列分段 Section II

求最小值的最大,最大值的最小,考慮二分 對於給定的乙個長度為n的正整數數列a i,現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。輸入格式 第1行包含兩個正整數n,m。第2行包含nn個空格隔開的非負整數a,含義如題目所述。輸出格式 乙個正整數,即每段和最大值最小為多少。輸入樣例 1...