先附上题目
这道题是一道典型的二分,有求最大值的最小值和最小值的最大值基本都可以用二分来做。
最多可以分成n组,即每个元素自成1组,那么此时最大值为最大的数组元素
最少可以分成1组,此时的结果为所有元素的和
我们要求的结果就在上述二者之间,构造1个函数来解决
bool P(long long x)
{
int b=0,num=0;
for(int i=1;i<=n;i++)
{
if(b+a[i]<=x)
b+=a[i];
else
{
b=a[i];
num++;
}
}
return num>=m;
}
b是用来记录当前组别的和,num记录当前状态下的组数
while(l<=r)
{
long long mid=(l+r)>>1;
if(P(mid))
l=mid+1;
else
r=mid-1;
}
这是二分的主要过程,其中l的初值是所有元素的最大值,r的初值是所有元素的和