数列分段 II

problem:
一个长度为N的正整数数列A[i]
将其分成M段,并要求每段连续
求每段和最大值(M段各自的和中最大的那个)最小(某种方案下最小)。

solution:
二分+贪心

#include
using namespace std;

const int N=1e5+10;

int a[N];
int n,m;

bool check(int x){
	int t=0,cnt=1;    //cnt初始值必须为1 
	for(int i=1;i<=n;i++){
		if(a[i]>x) return false;  //bug
		if(t+a[i]<=x) t+=a[i];
		else{
			t=a[i];
			cnt++;
		} 
	}
	return cnt<=m;
}
int main(){
	cin>>n>>m;
	int l=0,r=0;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		r+=a[i];
	}
	
	while(l>1;
		if(check(mid)) r=mid;
		else l=mid+1;
	}
	
	cout<

你可能感兴趣的:(二分)