题目传送门
题目要求最小值最大,而且分组是连续的,那么就没什么好说的了,二分答案+线扫直接上。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=a;i>=n;i--)
#define Clear(a,x) memset(a,x,sizeof(a))
#define ll long long
#define INF 2000000000
#define eps 1e-8
#define db double
using namespace std;
int read(){
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') f=ch=='-'?-1:f,ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=50005;
int n,m;
ll l,r;
ll a[maxn];
bool check(ll mid){
ll sum=0,k=1;
rep(i,1,n){
if (sum+a[i]>mid) k++,sum=0;
if (k>m) break;
sum+=a[i];
}
return k<=m;
}
int main(){
n=read(),m=read();
rep(i,1,n) a[i]=read(),r+=a[i];
while (l<r){
ll mid=(l+r)>>1;
if (check(mid)) r=mid;
else l=mid+1;
}
printf("%lld\n",r);
return 0;
}