數列分段 二分

2021-08-22 19:21:33 字數 701 閱讀 6264

給出乙個數字串,將它分成

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那麼就必然不成立。

#include 

#include

using

namespace

std;

int n,m,s[100011],l,r,mid,sum,k;

int main()

l=1;

r=s[n];

while (l2;

sum=0;

k=0;

for (int i=1;i<=n;i++)

if (s[i]-s[k]>mid) //這一部分超過答案

}if (sumelse l=mid+1;

}printf("%d\n",r);

return

0;}

數列分段 二分

題目鏈結 數列分段 描述對於給定的乙個長度為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...

數列分段 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...