1. 程式人生 > >Monthly Expense OpenJ_Bailian

Monthly Expense OpenJ_Bailian

  • Monthly Expense

  • 最大值最小化:

  • 我們假設x為最小的最大值,那麼x-1是不滿足條件的,x+1是滿足條件的。但他不滿足最小,

  • 假設我們左邊界是L,右邊界是R,我們二分一個答案ans,ans為第一個滿足條件的數

  • 題意:共n個月,給出每個月的開銷.將n個月劃分成m個時間段,求m個時間段中開銷最大的時間段的最小開銷值。

  • 思路:二分答案,答案可能範圍為單個最大值——所有值的sum,不斷二分去把最大值最小化

  • check檢驗這種最大值情況符不符合:如果連續求和過程中超過了當前列舉的答案那麼久cnt++,now=0;

  • 最終看看能不能在題目給定的m次之內把他們都合法的分開。

  • #include<bits/stdc++.h>
    using namespace std;
    vector<int>a;
    int n,m,l,x,r;
    bool check(int mid)
    {
        int cnt=0,now=0;
        for(int i=0; i<n; i++)
        {
            if(a[i]>mid)return 0;
            if(now+a[i]>mid)
            {
                cnt++;
                now=0;
            }
            now+=a[i];
        }
        return cnt<m;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        a.clear();
        r=0,r=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&x);
            a.push_back(x);
            r+=a[i];
            l=max(l,a[i]);
        }
        while(l<r)
        {
            int mid=(l+r)/2;
            if(check(mid))r=mid;
            else l=mid+1;
        }
        cout<<l<<endl;
        return 0;
    }