【笔记】分组

牛牛有一个n个数字的序列(a_1,a_2,dots,a_n),现在牛牛想把这个序列分成k段连续段,牛牛想知道分出来的k个连续段的段内数字和的最小值最大可以是多少?

    int solve(int n, int k, vector<int>& a) {
        int sum=0;
        for(int i=0;i<a.size();++i)
        {
            sum+=a[i];
        }
        int l=0,r=sum;  //最小时为0,最大为各个元素的和
        while(l<r)
        {
            int mid=(l+r+1)/2;
            if(binsearch(k,a,mid)) 
            {
                l=mid;
            }
            else
            {
                r=mid-1;
            }
        }
        return l;
    }
    bool binsearch(int k,vector<int>& a,int val)
    {
        int count=0;
        int sum=0;
        for(int i=0;i<a.size();++i)
        {
            sum+=a[i];
            if(sum>=val)    
            {
                sum=0;
                count++;
            }
        }
        return count>=k;
    }
原文地址:https://www.cnblogs.com/acmer-hmin/p/13529190.html