P1181 数列分段Section I AC于2018.7.23 https://www.luogu.org/problemnew/show/P1181

题目描述

对于给定的一个长度为 NN 的正整数数列 A_iAi​ ,现要将其分成连续的若干段,并且每段和不超过 MM (可以等于 MM),问最少能将其分成多少段使得满足要求。

输入输出格式

输入格式:

第1行包含两个正整数 N,MN,M ,表示了数列 A_iAi​ 的长度与每段和的最大值,第 22 行包含 NN 个空格隔开的非负整数 A_iAi​ ,如题目所述。

输出格式:

一个正整数,输出最少划分的段数。

输入输出样例

输入样例#1: 

5 6
4 2 4 5 1

输出样例#1: 

3

说明

对于 20\%20% 的数据,有 N≤10N≤10 ;

对于 40\%40% 的数据,有 N≤1000N≤1000 ;

对于 100\%100% 的数据,有 N≤100000,M≤10^9N≤100000,M≤109 , MM 大于所有数的最小值, A_iAi​ 之和不超过 109109 。

将数列如下划分:

[4][2 4][5 1][4][24][51]

第一段和为 44 ,第 22 段和为 66 ,第 33 段和为 66 均满足和不超过 M=6M=6 ,并可以证明 33 是最少划分的段数。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,a[100002],s;
int main()
{
    int i;
    scanf("%d%d",&n,&m);
    s=n+1;
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]+a[i-1]<=m)
        a[i]+=a[i-1],s--;
    }
    printf("%d",s);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41100192/article/details/81176704
今日推荐