最大值最小一般都是二分
#include <iostream>
#include <string.h>#include <stdio.h>
#include <stdlib.h>
#include <cmath>
using namespace std;
#define MAXN 111111
int num[MAXN];
int l, r;
int n, m;
int cal(int sum)
{
int res = 0, cnt = 1;
for( int i = 0; i < n; i++)
{
if(res + num[i] <= sum)
res += num[i];
else
{
res = num[i];
cnt++;
}
}
return cnt;
}
void solve()
{
int mid = 0;
while(l < r)
{
mid = ( l + r) >> 1;
//cout<<l<<"---"<<r<<endl;
if(cal(mid) <= m)
r = mid;
else if(cal(mid) > m)
l = mid + 1;
}
printf("%d\n",l);
return ;
}
int main()
{
while(scanf("%d %d",&n, &m) != EOF)
{
l = r = 0;
for(int i = 0; i < n; i++)
{
scanf("%d",&num[i]);
r += num[i];
if(l < num[i])
l = num[i];
}
solve();
}
return 0;
}