洛谷 P1182 数列分段 Section II 二分详细讲解

根据题意可以看出,我们二分的,每段和的最大值的,左边界为数组中最大的一个数,右边界为所有数之和。

我们可以二分这个每段和的最大值,找出满足m段的最小值

根据图来理解代码的注解

cpp 复制代码
const int N = 1e5 + 10;


int n,m;
int a[N];

bool check(int x)
{
	int cnt = 0,sum = 0;//段数,每段的总和
	for (int i = 1;i <= n;i ++)
	{
		if (sum + a[i] <= x) sum += a[i];
		else cnt ++,sum = a[i];
	}
	cnt ++;//记录最后一段
	return cnt > m;//段数>m,说明当前这个最大值偏小
}

void solve()
{
	cin >> n >> m;
	int maxn = 0,sum = 0;
	for (int i = 1;i <= n;i ++) 
		cin >> a[i],maxn = max(maxn,a[i]),sum += a[i];
	
	int l = maxn - 1,r = sum + 1;//根据题意可以看出,左边界为maxn,右边界为sum。这样写是为了将取值范围扩大,避免边界出错
	while(l + 1 != r)
	{
		int mid = l + r >> 1;//二分最大值
		if (check(mid)) l = mid;//mid偏小
		else r = mid;
	}


	cout << r << endl;//输出边界线的右边

	
		
} 
相关推荐
努力学算法的蒟蒻2 分钟前
day40(12.21)——leetcode面试经典150
算法·leetcode·面试
ToddyBear5 分钟前
从字符游戏到 CPU 指令集:一道算法题背后的深度思维跃迁
数据结构·算法
光影少年7 分钟前
前端算法新手如何刷算法?
前端·算法
JAVA+C语言10 分钟前
C++ 继承与派生
开发语言·c++
Andyshengwx17 分钟前
图论 最小生成树 MST问题
c++·算法·图论
賬號封禁中miu18 分钟前
图论之最小生成树
java·数据结构·算法·图论
闻缺陷则喜何志丹19 分钟前
【图论 拓扑排序 贪心 临项交换】P5603 小 C 与桌游 题解|普及+
c++·算法·图论·贪心·拓扑排序·洛谷·临项交换
闻缺陷则喜何志丹20 分钟前
【图论 BFS染色 并集查找 】P3663 [USACO17FEB] Why Did the Cow Cross the Road III S|普及+
c++·算法·图论·染色法·宽度优先·并集查找
青山如墨雨如画21 分钟前
【北邮-研-图论】网络最大流的标号算法V1.0
网络·算法·图论·北邮
chao18984421 分钟前
基于MATLAB实现NSGA-II算法
开发语言·算法·matlab