描述
题解
这道题,话题是二分,并且讨论区中 qwb 说这是五级题中最最最简单的题了,于是我也只好向着二分想,可是我想了十几分钟也没有想通如何二分,大概是我思维闭塞吧,二分没有用到精髓,看了讨论区的大致思路,一下子就明白了,二分+贪心。
首先求所有数的和,然后二分之,根据每一个 mid 判断是否有合法的分割手法,当然这个判断用的就是贪心的思维,代码十分容易理解,作为职业马后炮,我必须说,这个题是五级题最简单的了,如果你大脑没有抽筋儿的话。像我这种大脑别跟儿筋的人,越是往二分想,越卡壳,因为只想着二分搞,却忽略了需要结合贪心判定。
代码
#include <iostream>
using namespace std;
typedef long long ll;
const int MAXN = 5e4 + 10;
int N, K;
ll A[MAXN];
int check(ll num)
{
int m = K;
ll sum = 0;
for (int i = 0; i < N; i++)
{
if (sum + A[i] > num)
{
sum = A[i];
m--;
}
else
{
sum += A[i];
}
}
if (m > 0)
{
return 1;
}
return 0;
}
ll bs(ll l, ll r)
{
while (l < r)
{
ll mid = (l + r) >> 1;
if (check(mid))
{
r = mid;
}
else
{
l = mid + 1;
}
}
return l;
}
int main()
{
cin >> N >> K;
ll sum = 0;
for (int i = 0; i < N; i++)
{
scanf("%lld", &A[i]);
sum += A[i];
}
cout << bs(1, sum) << endl;
return 0;
}