zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
  • 相关阅读:
    TCP/IP
    logging模块
    HttpClient当HTTP连接的时候出现大量CLOSE_WAIT连接(转)
    三 os模块
    一 time与datetime模块
    (转)HTTPS到底是个啥玩意儿?
    Python
    Codeforces Round #374 (Div. 2)
    Codeforces Round #373 (Div. 2)
    bzoj3527: [Zjoi2014]力
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9499907.html
Copyright © 2011-2022 走看看