题目地址


个人思路:

  • 显然是二分,但是有几个点要注意.
  • 左边界l需要初始化为数列中的最大值,否则就要在judge方法中进行繁琐的判断
  • m是分成的段数,实际只能分m-1次
  • 洛谷的评测机不会给变量自动赋值,需要手动初始化l,r

#include<cstdio>
#include<iostream>
using namespace std;
const int MAXN=1000010,INF=2e9;
int a[MAXN],n,m;
bool judge(int x){
	int nowTotal=0,rest=m-1;
	for(int i=1;i<=n;i++){
		if(nowTotal+a[i]<=x){
			nowTotal+=a[i];
		}else{
			rest--;
			nowTotal=a[i];
		}
	}
	return rest>=0;
}
int main(){
	int l,r;
	l=-2e9,r=2e9;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		l=max(l,a[i]);
	}
	while(l<r){
		int mid=(l+r)>>1;
		if(judge(mid))r=mid;
		else l=mid+1;
	}
	cout<<l<<endl;
	return 0;
}