給出乙個數字串,將它分成
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...