分析
二分所有段中和的最大值
累加所有数的和作为初始右边界
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[100001],l,r,mid;
int jq(int x)
{
int sum=0,ans=1;
for(int i=1;i<=n;i++)
{
if(a[i]>x) return 0;
if(sum+a[i]>x)
{
sum=a[i];
ans++;
}
else sum+=a[i];
}
if(ans<=m) return 1;
else return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
r+=a[i];
}
l=1;
while(l<r)
{
int mid=(l+r)>>1;
if(jq(mid)) r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}