http://poj.org/problem?id=3273
和POJ3258很像,无非是把最大化最小值改为最小化最大值。
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
#include<algorithm>
#define N 100005
#define INF 0x3f3f3f3f
using namespace std;
int n, m, l, r, mid, a[N];
bool ok(int x)
{
int s, site, k;
s = 0;
site = 0;
k = 0;
while (1)
{
k++;
s = a[site];
if (s > x) break;
while (s + a[site+1] <= x && site+1 < n)
{
site++;
s += a[site];
}
if (k > m || site+1 >= n) break;
site++;
}
if (s > x || k > m) return false;
else return true;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
l = 0;
r = INF;
while (r - l > 1)
{
mid = (l + r) / 2;
if (ok(mid)) r = mid;
else l = mid;
}
printf("%d\n", r);
return 0;
}