【YbtOJ高效进阶 二分-1】数列分段

链接

YbtOJ高效进阶 二分-1

题目描述

对于给定的一个长度为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;
}

猜你喜欢

转载自blog.csdn.net/LTH060226/article/details/112132208