數列分段 二分

2021-10-09 02:27:21 字數 1059 閱讀 1513

題目鏈結

數列分段

描述對於給定的乙個長度為n的正整數數列a[1..n]a[1..n],現要將其分成mm(m≤nm≤n)段,並要求每段連續,且每段和的最大值最小。

關於最大值最小:例如一數列4 2 4 5 1要分成3段。

將其如下分段:[4 2] [4 5] [1]

第一段和為6,第2段和為9,第3段和為1,和最大值為9。

將其如下分段:[4] [2 4] [5 1]

第一段和為4,第2段和為6,第3段和為6,和最大值為6。

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

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

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

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

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

輸入樣例 1 

5 3

4 2 4 5 1

輸出樣例 1

6
提示

對於 100% 的資料,1≤ n≤ 100,000,m≤n,a[i]≤ 10^8

答案不超過10^9

#include #include int n, m;

int l, r, mid, ans;

int a[100010];

//二分答案,列舉出乙個最大值,根據分組情況調整最大值,求出最優最大值。

/* * check 函式

* 作用:

* 根據列舉出的最大值,來分組,根據分出的組數來調整最大值

* 變數:

* x : 列舉出的最大值

* sum : 分組時每組的和

* count : 分出的組數

*/bool check(int x)

int main()

while( l<=r )

}printf("%d",l);

return 0;

}

數列分段 二分

給出乙個數字串,將它分成 m m 個部分,要求每個部分的和的最大值最小。很明顯的二分答案。首先利用字首和求出前 i role presentation i i個數字之和,然後l 1,r s n l 1 r s n 來二分和的最大值。要注意當任意乙個s i s i 1 m s i s i 1 m那麼就...

數列分段 Section II 二分

link description 給定乙個長度為n nn的序列,要求從中割成m mm段子區間,使m mm段子區間的區間和的最大值最小,輸出這個最大值 input 第 1 行包含兩個正整數 n,m。第 2 行包含 n 個空格隔開的非負整數 ai,含義如題目所述。output 乙個正整數,即每段和最大值...

數列分段Section II(二分)

洛谷傳送門 輸入時處理出最小的答案和最大的答案,然後二分答案即可。其餘細節看 1 include 2 include 3 4using namespace std 56 int n,m,a 100001 x,y,ans 100001 7 8bool pd int mid 919 20if tot m...