【二分】Ybt_数列分段

题目

给出 n 个数,让你分成 m 段,使得每段和最小。


二分答案。二分每段的和,然后判断能不能用m段分完。


代码

#include<cstdio>
int n, m, sum, l, r, mid, cnt, addd, a[100010];
int main(){
    
    
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; ++i){
    
    
		scanf("%d",&a[i]);
		sum += a[i];
	}
	l = 0; r = sum;
	while(l < r){
    
    
		mid = (l+r) / 2;
		cnt = 1; addd = 0;
		for(int i = 1; i <= n; ++i){
    
    
			if(addd + a[i] <= mid) addd += a[i];
			else if(a[i] > mid) cnt = m+1;
			else{
    
    
				++cnt;
				addd = a[i];
			}
			if(cnt > m) break;
		}
		if(cnt <= m) r = mid;
		else l = mid+1;
	}
	printf("%d", l);
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/112132149