洛谷P1182 数列分段`Section II`

这里写图片描述
这里写图片描述
.
.
.
.
.

分析

首先,分析题目,求最大值的最小化,直接联想到二分
然而关键是要怎么去高效的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;
}
posted @ 2018-08-13 19:34  银叶草  阅读(107)  评论(0编辑  收藏  举报
Live2D