1. 程式人生 > 實用技巧 >【筆記】分組

【筆記】分組

牛牛有一個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;
    }