Monthly Expense OpenJ_Bailian - 4135 -二分答案-(最大值最小化)

  • Monthly Expense

  •  OpenJ_Bailian - 4135
  • 最大值最小化:

  • 我们假设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;
    }
    

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/83926821