.
.
.
.
.
分析
首先,分析题目,求最大值的最小化,直接联想到二分
然而关键是要怎么去高效的check
我们考虑一个贪心的思路,能加的就加上,不能则新开一段,所以对于二分的值x,我们从数列a从前往后扫
如果t大于了w,我们不加而是t重新赋值并且tj++,最后只需判断tj是否不小于m就行了。
注意:二分时的区间取值问题,很明显,对于l的赋值应该取数列中的最大值,而r应该取数列的总和。
.
.
.
.
.
程序:
#include<iostream>
using namespace std;
int n,m,a[100001];
bool check(int w)
{
int t=0,tj=0;
for (int i=1;i<=n;i++)
if (t+a[i]<=w) t+=a[i];else
{
t=a[i];
tj++;
}
if (tj>=m) return true;else return false;
}
int main()
{
int l,r,mid;
cin>>n>>m;
for (int i=1;i<=n;i++)
{
cin>>a[i];
if (a[i]>l) l=a[i];
r+=a[i];
}
while (l<=r)
{
mid=l+r>>1;
if (check(mid)==true) l=mid+1;else r=mid-1;
}
cout<<l;
return 0;
}