题目描述
解题思路:
AC代码:
#include<iostream>
using namespace std;
const int maxn=1e5+100;
int N,M;
int A[maxn];
bool Isleft(int x){
int m=0,s=0,i=0;
while(i<N){
s+=A[i];
if(s>x&&i==N-1) m+=2;
else if(s<=x&&i==N-1) m++;
else if(s>x&&i<N-1){
s=A[i];
m++;
}
i++;
}
return m>M ? true : false;
}
int main(){
cin>>N>>M>>A[0];
int l=A[0]-1,r=A[0],mid;
for(int i=1;i<N;i++){
cin>>A[i];
l=max(l,A[i]-1);
r+=A[i];
}
r++;
while((l+1)!=r){
mid=(l+r)/2;
if(Isleft(mid)) l=mid;
else r=mid;
}
cout<<r<<endl;
return 0;
}