1 条题解

  • 0
    @ 2025-10-8 16:51:36
    #include<bits/stdc++.h> 
    using namespace std;
    const int N=110000;
    int n,m,a[N];
    bool check(int x)
    {
        int s=0, tm=1;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>x)return 0;
            if(a[i]+s<=x)s=s+a[i];
            else
            {
                tm++;if(tm>m)return 0;
                s=a[i];
            } 
        }
        return 1;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        int R=0, L=0, ans=-1;
        for(int i=1;i<=n;i++)scanf("%d",&a[i]), R=R+a[i]; 
        
        while(L<=R)
        {
            int mid=(L+R)/2;
            if(check(mid)) ans=mid, R=mid-1;
            else                   L=mid+1;
        }
        printf("%d",ans);
        return 0;
    }
    
    • 1

    *【二分】最大值最小(分m段)[USACO07MAR] Monthly Expense S

    信息

    ID
    280
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    247
    已通过
    78
    上传者