思路:
这题看到最大值最小,就想到用二分
二分答案,每次check一下即可
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
long long n, m;
long long ans;
long long a[1000100];
bool check(long long k)
{
long long s=1, sum=0;
for(long long i=1; i<=n; i++)
{
if(sum+a[i]<=k)
sum+=a[i];
else
{
if(a[i]>k)
return 0;
sum=a[i];
s++;
}
}
if(s>m)
return 0;
else return 1;
}
int main()
{
scanf("%lld%lld", &n, &m);
for(long long i=1; i<=n; i++)
scanf("%lld", &a[i]);
long long l=0, r=1e9;
while(l<=r)
{
long long mid=l+r>>1;
if(check(mid))
r=mid-1, ans=mid;
else
l=mid+1;
}
printf("%lld", ans);
return 0;
}