AC

举杯消愁愁更愁,月底账单入水流  •  3个月前


//二分算法
//当最大段和为x时,需要分成y段  从大到小,单调递减
#include<bits/stdc++.h>
using namespace std;
int n,m,l=-1e9,r=0;
int a[5005];
int getpart(int len){		//最大段和为len,所有段和都不超过len返回段数
	//每一段都小于等于len;
	int part=0;
	int sum=0;
	for(int i=1;i<=n;i++){
		if(sum+a[i]<=len){
			sum+=a[i];
		}else{
			part++;
			sum=a[i];
		}
	}
	return part+1;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];	
		l=max(l,a[i]);		//理论最小的最大段和:每一个各分一段
		r+=a[i];		//理论最大:全部是一段
	} 
	while(l<r){
		int mid=(l+r)/2;
		if(getpart(mid)<=m) r=mid;		//右缩左,保留mid
		else l=mid+1;		//mid丢掉
	}
	cout<<l<<endl;
	return 0;
}

评论:

请先登录,才能进行评论