https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1128
注意答案的二分性质,必须要满足在满足给定条件的所有情况的时候都满足要求才能更新ans。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll in()
{
ll res=0,p=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') p=-1; c=getchar();}
while(c>='0'&&c<='9') res=res*10+c-48,c=getchar();
return p*res;
}
void out(ll x)
{
if (x>9) out(x/10);
putchar(x%10+48);
}
const int maxn = 5e4 + 5;
int a[maxn];
int main()
{
int n, k;
n = in(); k = in();
for (int i = 0; i < n; ++i) a[i] = in();
ll l = 1, r = maxn * 1e9, ans;
while (l <= r){
ll m = (l + r) / 2, sum = 0;
int cnt = 1;
for (int i = 0; i < n; ++i){
sum += a[i];
if (sum > m) sum = a[i], ++cnt;
}
//这里,当cnt小于等于k时,任何的cnt一定能满足给定条件,因为在最大值被限定的情况下能分cnt组,那么一定可以分至少cnt组。
if (cnt > k) l = m + 1;
else ans = m, r = m - 1;
}
out(ans);
return 0;
}