letgogogogo

导航

洛谷P1182 数列分段 Section II

洛谷P1182 数列分段Section II

P1182 数列分段Section II

数列分段 Section II

题目描述

对于给定的一个长度为 的正整数数列 ,现要将其分成 )段,并要求每段连续,且每段和的最大值最小。

关于最大值最小:

例如一数列 要分成 段。

将其如下分段:

第一段和为 ,第 段和为 ,第 段和为 ,和最大值为

将其如下分段:

第一段和为 ,第 段和为 ,第 段和为 ,和最大值为

并且无论如何分段,最大值不会小于

所以可以得到要将数列 要分成 段,每段和的最大值最小为

输入格式

行包含两个正整数

行包含 个空格隔开的非负整数 ,含义如题目所述。

输出格式

一个正整数,即每段和最大值最小为多少。

样例 #1

样例输入 #1

5 3
4 2 4 5 1

样例输出 #1

6

提示

对于 的数据,

对于 的数据,

对于 的数据,, 答案不超过

题解

#include<cstdio>
#include<algorithm>
using namespace std;
int a[100100],n,m;
bool check(int x)
{
    int sum = 0, cnt = 1;
    for (int i=1; i<=n; ++i)
    {
        sum += a[i];
        if (sum>x)
        {
            cnt++;
            sum = a[i];
            if (cnt>m) return false ;
        }
    }
    return true ;
}
int main()
{
    int l = 0, r = 0, ans;
    scanf("%d%d",&n,&m);
    for (int i=1; i<=n; ++i)
    {
        scanf("%d",&a[i]);
        r += a[i]; 
        l = max(l,a[i]);
    }
    while (l<=r)    
    {
        int mid = (l+r)>>1;
        if (check(mid))
        {
            ans = mid;
            r = mid-1;
        }
        else l = mid+1;
    }
    printf("%d",ans);
    return 0;
}

 

posted on 2024-11-13 19:35  总在北极扫雪  阅读(14)  评论(0编辑  收藏  举报