>Description
>解题思路
这一道题我一开始做的时候想到了O(n^3)的DP,显然不是正解,本来想一下怎样优化DP,突然想到了二分答案真是sb这么二分答案的题我竟然想了这么久TT
二分可能的答案,按照答案进行分块,如果块的个数小于等于m,说明此答案可行(小于m的话可以再分几块,答案肯定还是可以的),否则不行
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#define N 100005
#define ll long long
using namespace std;
ll n, m, a[N], l, r, mid;
bool check (ll c)
{
ll w = 0, p = 1;
for (ll i = 1; i <= n; i++)
{
if (w + a[i] > c) w = a[i], p++;
else w += a[i];
}
if (p <= m) return 1;
return 0;
}
int main()
{
scanf ("%lld%lld", &n, &m);
for (ll i = 1; i <= n; i++)
{
scanf ("%d", &a[i]);
r += a[i];
l = max (l, a[i]);
}
while (l < r)
{
mid = (l + r) / 2;
if (check (mid)) r = mid;
else l = mid + 1;
}
printf ("%lld", l);
return 0;
}