problem:
一个长度为N的正整数数列A[i]
将其分成M段,并要求每段连续
求每段和最大值(M段各自的和中最大的那个)最小(某种方案下最小)。
solution:
二分+贪心
#include<bits/stdc++.h>
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<r){
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l<<endl;
}