>link
>解题思路
二分答案,然后贪心判断mid可不可行
>Code
#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
long long l, r, mid, ans, a[100100];
bool check(long long x) {
//贪心
int k = 1;
long long sum = a[1];
for (int i = 2; i <= n; i++) {
if (sum + a[i] <= x)
sum += a[i];
else {
sum = a[i];
k++;
}
}
return (k <= m);
}
int main(){
scanf ("%d%d", &n, &m);
scanf ("%lld", &a[1]);
l = r = a[1];
for (int i = 2; i <= n; i++) {
scanf ("%lld", &a[i]);
r += a[i];
l = max(l, a[i]);
}
while (l <= r) {
mid = (l + r) / 2;
if (check(mid))
r = mid - 1, ans = mid;
else
l = mid + 1;
}
printf ("%lld", ans);
}