链接
题目描述
对于给定的一个长度为N 的正整数数列 ,现在将其分成 M 段,并要求每段连续,且每段和的最大值最小。
样例输入
5 3
4 2 4 5 1
样例输出
6
思路
二分题目中的最大值,若当前数列再加就超过,那就划一段,否则继续加
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n, m, a[1000005], l, r, ans;
bool check(int x)
{
int sum = 0, num = 1;
for(int i = 1; i <= n; ++i)
{
if(sum + a[i] <= x) sum += a[i];
else {
sum = a[i];
num++;
}
if(num > m) return 0;
}
if(num > m) return 0;
return 1;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), r += a[i], l = max(a[i], l);
while(l <= r)
{
int mid = (l + r) / 2;
if(check(mid)) r = mid - 1, ans = mid;
else l = mid + 1;
}
printf("%d", ans);
return 0;
}