Luogu P1182
给 n 个数,分成连续的 m 段,求分段后每段和的最大值的最小值。
标准二分法
#include<iostream>
using namespace std;
const int maxn=1e5+10;
int n,m,a[maxn];
bool check(int x){
int sum=0,cnt=0;
for(int i=0;i<n;i++)
if(sum+a[i]<=x) sum+=a[i];
else sum=a[i],++cnt;
if(cnt>=m) return true;
else return false;
}
int main(){
int l=0,r=0;
cin>>n>>m;
/*求答案所在闭区间[l,r]*/
for(int i=0;i<n;i++){
cin>>a[i];
if(l<a[i]) l=a[i];
r+=a[i];
}
/*闭区间[l,r]内二分查找答案*/
while(l<=r){
int mid=(l+r)/2;
if(check(mid)) l=mid+1;
else r=mid-1;
}
cout<<l;
return 0;
}