zoukankan      html  css  js  c++  java
  • 1436:数列分段II

    1436:数列分段II

    题解

    二分答案

        我们最终答案的取值区间是[  max(a[i])  ,   ∑a[i]  ]

        设定 l=max(a[i]) , r=∑a[i]  , mid不断二分

        mid表示每段和的最大值,也就是每段和都不超过mid

        放到check函数里,计算一下在mid为最大值的情况下可以分成多少段

        如果段数 cnt > m ,说明这个mid小了,它还可以再大一点

        如果段数 cnt <= m , 说明这个mid大了,那么它就要小一点了,由于此时cnt可能等于m,这个mid为候选答案,记录下来(如果他是真正答案,最后输出的就是他,否则他会被更新为一个更小的)

    代码

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<functional>
    
    using namespace std;
    
    int n,m,ans,l=0,r=0;
    int a[100001];
    int sum[100001]; 
    
    int check(int x)
    {
        int cnt=1,now=0;
        for(int i=1;i<=n;i++)
        {
            if(now+a[i]<=x) now+=a[i];
            else
            {
                cnt++;
                now=a[i];
            }
        }
        return cnt<=m;
    }
    
    int main()
    {
         scanf("%d%d",&n,&m);
         for(int i=1;i<=n;i++)
         {
             scanf("%d",&a[i]);
             l=max(l,a[i]);
             r+=a[i];
         }
         
         while(l<=r)
         {
             int mid=(r+l)/2;
             if(check(mid)) 
             {
                 ans=mid;
                 r=mid-1;
            }
            else l=mid+1;
         }
           
        printf("%d",ans);
        
    }
  • 相关阅读:
    Javascript注销Window认证登录信息
    Asp.Net文件下载
    Python Beginner's Guide
    StructureMap
    Telerik RadGanttView示例
    SharePoint Server 2010 备份还原和部署
    Bootstrap
    Javascript面向对象基础
    .NET Regular Expressions
    Javascript Arguments Callee Caller
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/10990232.html
Copyright © 2011-2022 走看看