代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<vector>
#include<math.h>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
#include<cctype>
#include<queue>
#define ll long long
// freopen("D:\\in.txt" ,"r" ,stdin);
// freopen("D:\\out.txt" ,"w" ,stdout);
using namespace std;
int tot,cnt;
int sum;
int mx=-1;
int n,m,mid,l,r;
int a[100005];
bool judge(int x,int a[])//每段最大值不能超过x
{
tot=0;
cnt=0;
for(int i=1;i<=n;i++)
{
if(tot+a[i]<=x) tot+=a[i];
else
{
tot=a[i];
cnt++;
}
}
return cnt>=m;
}
int main(void)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
if(a[i]>mx) mx=a[i];
}
l=mx;
r=sum;
while(l<=r)
{
mid=(r+l)/2;
if(judge(mid,a)) l=mid+1;//看上面的函数 return加了等于号时 变动的是l 而不是r因此最后要输出l
else r=mid-1;
}
cout<<l;
return 0;
}