1436:数列分段II

Posted xiaoyezi-wink

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    

 

以上是关于1436:数列分段II的主要内容,如果未能解决你的问题,请参考以下文章

数列分段II

模板P1182数列分段II——二分答案

数列分段II(二分)

P1182 数列分段Section II

P1182 数列分段`Section II`

P1182 数列分段`Section II`