思路:
二分,分每段的和。
C o d e Code Code:
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,a[1000001];
int r,l,mid;
bool check(int mid)//分每段的和
{
int sum=0,ans=0;
for(int i=1;i<=n;i++)
if(sum+a[i]<=mid)sum+=a[i];//左边
else {sum=a[i],ans++;}//右边
return ans>=m;//确保ans>m
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
r+=a[i];//右端点
}
l=0;//左端点
while(l<=r)//二分查找模板
{
mid=(l+r)/2;//中间点
if(check(mid))l=mid+1;
else r=mid-1;
}
printf("%d",l);//输出
return 0;
}