P1182 數列分段 Section II

2022-05-18 06:19:36 字數 2234 閱讀 5527

提交 34.77k

通過 11.79k

時間限制 1.00s

記憶體限制 125.00mb

題目提供者洛谷

難度普及/提高-

歷史分數100

提交記錄

檢視題解

檢視演算法標籤

進入討論版

檢視討論

檢視推薦

展開 對於給定的乙個長度為n的正整數數列 a1∼na_a1∼n​,現要將其分成 mmm(m≤nm\leq nm≤n)段,並要求每段連續,且每段和的最大值最小。

關於最大值最小:

例如一數列 4 2 4 5 14\ 2\ 4\ 5\ 142451 要分成 333 段。

將其如下分段:

[4 2][4 5][1][4\ 2][4\ 5][1] [42][45][1]

第一段和為 666,第 222 段和為 999,第 333 段和為 111,和最大值為 999。

將其如下分段:

[4][2 4][5 1][4][2\ 4][5\ 1] [4][24][51]

第一段和為 444,第 222 段和為 666,第 333 段和為 666,和最大值為 666。

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

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

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

第 222 行包含 nnn 個空格隔開的非負整數 aia_iai​,含義如題目所述。

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

輸入 #1

5 3

4 2 4 5 1

輸出 #1

思路

要求最大值最小,二分即可。因為要求段的最大值所以在 max a[i] ~ sum a[i] 中二分答案。

如果在 1 ~ sum a[i] 中二分會wa4,調了半個多小時不知道為什麼,翻了翻題解也沒人解釋。。。

code

1 #include 2

#define dbg(x) cout << #x << "=" << x << endl

3#define eps 1e-8

4#define pi acos(-1.0)56

using

namespace

std;

7 typedef long

long

ll;8

9 templateinline void read(t &res)

1015

16namespace

_buff

24return ib == ie ? -1 : *ib++;25}

26}2728

intqread()

36if (c == '-'

) 40

for (; c >= '

0' && c <= '

9'; c =getc())

43return pos ? ret : -ret;44}

4546

const

int maxn = 1e5 + 7;47

48int

n,k;

49int

a[maxn];

50int

ans;

51int

maxx;

5253 inline bool check(int

x) 59

else63}

64if(cnt >=k)

67return

false;68

}6970int

main()

7180

//l = 1, r = 1e9;

81 mid = (l + r) >> 1;82

while( l <=r)

87else90}

91 printf("

%d\n

",l);

92return0;

93 }

view code

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