1436 數列分段II

2022-04-12 03:58:10 字數 875 閱讀 6461

題解

二分答案

我們最終答案的取值區間是[  max(a[i])  ,   ∑a[i]  ]

設定 l=max(a[i]) , r=∑a[i]  , mid不斷二分

mid表示每段和的最大值,也就是每段和都不超過mid

放到check函式裡,計算一下在mid為最大值的情況下可以分成多少段

如果段數 cnt > m ,說明這個mid小了,它還可以再大一點

如果段數 cnt <= m , 說明這個mid大了,那麼它就要小一點了,由於此時cnt可能等於m,這個mid為候選答案,記錄下來(如果他是真正答案,最後輸出的就是他,否則他會被更新為乙個更小的)

**

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,m,ans,l=0,r=0

;int a[100001

];int sum[100001

]; int check(int

x) }

return cnt<=m;

}int

main()

while(l<=r)

else l=mid+1

; }

printf("%d

",ans);

}

1436 數列分段II

1436 數列分段ii 時間限制 1000 ms 記憶體限制 65536 kb 提交數 1519 通過數 693 題目描述 對於給定的乙個長度為n的正整數數列a i 現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4 2 4 5 1要分成3段 將其如下分段...

貪心 數列分段II

時間限制 1 sec 記憶體限制 128 mb 題目描述 對於給定的乙個長度為n的正整數數列ai,現要將其分成連續的若干段,並且每段和不超過m 可以等於m 問最少能將其分成多少段使得滿足要求。輸入第一行包含兩個正整數n,m,表示了數列ai的長度與每段和的最大值 第二行包含n個空格隔開的非負整數ai。...

題解 數列分段II

對於給定的乙個長度為n的正整數數列a i,現要將其分成m m n m m n m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列42451要分成333段 將其如下分段 42 45 1 第一段和為6,第2段和為9,第3段和為1,和最大值為9。將其如下分段 4 24 51 ...