数列分段
数列分段 Section II
题目描述
对于给定的一个长度为
关于最大值最小:
例如一数列
将其如下分段:
第一段和为
将其如下分段:
第一段和为
并且无论如何分段,最大值不会小于
所以可以得到要将数列
输入格式
第
第
输出格式
一个正整数,即每段和最大值最小为多少。
样例 #1
样例输入 #1
5 3
4 2 4 5 1
样例输出 #1
6
提示
对于
对于
对于
题解
依旧是二分查找,但这题中有个易错点
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int n, m, a[100005], l, r, mid, ans;
int main() {
scanf("%d%d", &n, &m);
l = 0; r = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
l = max(l, a[i]);
r +=a[i];
}
while (l <= r) {
mid = (l + r) >> 1;
int num = 1;//组数。由于在下面循环中,最后一组不会被记录,因此初始化为1
int sum = 0;//每组数字之和
for (int i = 0; i < n; i++) {
if (sum+a[i] > mid) {
num ++;
sum = a[i];
}
else sum += a[i];
}
if (num <= m) {
ans = mid;
r = mid - 1;
}
else l = mid + 1;
}
printf("%d\n", ans);
return 0;
}
后记
这个二分还是有点让人头疼,于是这样改了改,或许,能看的明白点?
if (num <= m) {
ans = mid;
r = mid - 1;
}
else l = mid + 1;