/*
题意: 给你天数N(1 ≤ N ≤ 100,000),和每天需要花的钱(存放在数组中),
让你把这些天分成M(1 ≤ M ≤ N)份(每份都是连续的天),
要求每份的和最大值尽量小,输出这个和。
分析:二分,用最大money[]为左端点,money[]总和为右端点...要求的结果一定
在该范围内.. 所以要求mid的最优值
时间复杂度为:n*lg(n)...
*/
#include<iostream>
#include<algorithm>
#define manx 100009
using namespace std;
int n,m; /// 天数,人数
int money[manx]; ///
bool judge(int mid){ /// 判断 mid 值是否符合条件
int sum=0,ans=1;
for(int i=1;i<=n;i++){
if(sum+money[i]<=mid)
sum+=money[i];
else { sum=money[i]; ans++; }
}
// cout<<ans<<endl;
if(ans>m) return false;
else return true;
}
int main(){
while(cin>>n>>m){
int right=0,left=0;
for(int i=1;i<=n;i++){
scanf("%d",&money[i]);
if(money[i]>left)
left=money[i];
right += money[i];
}
int mid=(left+right)>>1;
while(left<right){
// cout<<left<<" "<<mid<<" "<<right<<" ";
if(!judge(mid))
left=mid+1; /// mid 偏小
else
right=mid-1; /// mid 偏大
mid=(left+right)>>1;
// system("pause");
}
cout<<mid<<endl;
}
}
/*
7 4
100
400
300
100
500
101
400
*/