P1182 數列分段Section II

2022-04-06 21:02:42 字數 1030 閱讀 4242

對於給定的乙個長度為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,第2段和為6,第3段和為6,和最大值為6。

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

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

輸入格式:

輸入檔案divide_b.in的第1行包含兩個正整數n,m,第2行包含n個空格隔開的非負整數a[i],含義如題目所述。

輸出格式:

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

輸入樣例#1:

5 3

4 2 4 5 1

輸出樣例#1:

6

對於20%的資料,有n≤10;

對於40%的資料,有n≤1000;

對於100%的資料,有n≤100000,m≤n, a[i]之和不超過10^9。

典型的二分答案,注意l不能從0開始,數字是不可以分開的,可能沒有為0的數字,所以要從最大的數開始,保證數字沒有拆分

1 #include2 #include3

using

namespace

std;

4int a[100100

],n,m;

5bool check(intx)6

17}18return

true;19

}20intmain()

2134

else l = mid+1;35

}36 printf("%d"

,ans);

37return0;

38 }

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...