题意是n个数,分成m段,所有段的最大值最小,求那个最大值。
二分那个最大值x,然后把n个数相当于往上界为x的袋子里装,看需要装几个袋子,是不是比要求的m大。
#include <cstdio>
#include <algorithm>
#include <climits>
const int MAXN = 1e5 + 5;
int sum, a[MAXN];
int n, m;
bool check(int x)
{
// if (sum / m <= x) return true;
// return false;
int res = 0;
int now = 0;
for (int i = 0; i < n; i++)
{
now += a[i];
if (now > x)
{
now = a[i];
res++;
}
}
if (res + 1 > m) return false;
return true;
}
int main()
{
scanf("%d %d", &n, &m);
int max = -INT_MAX;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
max = std::max(max, a[i]);
sum += a[i];
}
//printf("%d %d\n\n", sum, max);
int l = max, r = sum;
int ans = r;
while (l < r)
{
//printf("%d %d\n", l, r);
int mid = l + (r - l) / 2;
if (check(mid))
{
ans = std::min(ans, mid);
r = mid;
}
else
{
l = mid + 1;
}
}
printf("%d\n", ans);
return 0;
}
又是裸题。。。