典型的二分题目,需要主意的一个坑点在代码中~~
//@author:hairu,wu
//@from:ahut
#include<iostream>
using namespace std;
int n,m;
int a[100010];
bool check(int x){
int cnt=0;
int now=x;
for(int i=0;i<n;i++){
if(a[i]>x){//这一步特别重要,如果其中某一个数大于x,则这个x必然不可以包含这个x
return false;
}
if(now>=a[i]){
now-=a[i];
}else{
cnt++;
now=x;
i--;
}
}
if(now>=0){
cnt++;
}
return cnt<=m;
}
int main(){
cin>> n>>m;
int left=100010,right=0;
for(int i=0;i<n;i++){
cin >> a[i];
if(a[i]<left){
left=a[i];
}
right+=a[i];
}
int ans=0;
while(left<=right){
int mid=(left+right)/2;
if(check(mid)){
ans=mid;
right=mid-1;
}else{
left=mid+1;
}
}
cout<<ans<<endl;
return 0;
}