/* 二分答案 这个题目要求“体力和最小的那个小组的所有人的体力和尽量大” 很明显我们二分最小体力 如果合法 逐渐放大 但是这里我们二分的是最小而不是最大 所以累加的体力>=ans时 跳过当前体力i (可以认为把他归给了上一组) 累加和=0 继续分组 */ #include<iostream> #include<cstdio> #include<cstring> #define ll long long #define maxn 30010 #define inf 1000000000 using namespace std; ll n,m,ans,a[maxn]; bool can(ll x) { ll tot=0,s=0; for(int i=1;i<=n;i++) if(s+a[i]<x)s=s+a[i]; else { s=0;tot++; } if(tot>=m)return 1; else return 0; } int main() { scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++) scanf("%lld",&a[i]); ll l=0,r=inf; while(l<=r) { ll mid=(l+r)/2; if(can(mid)) { l=mid+1; ans=mid; } else r=mid-1; } printf("%lld ",ans); return 0; }