数列分段 Section I

题目描述

对于给定的一个长度为 【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据 的正整数数列 【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_02,现要将其分成连续的若干段,并且每段和不超过 【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_03(可以等于【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_03),问最少能将其分成多少段使得满足要求。

输入格式

第1行包含两个正整数 【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_05,表示了数列 【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_02 的长度与每段和的最大值,第 【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_07 行包含 【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据 个空格隔开的非负整数 【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_02,如题目所述。

输出格式

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

样例 #1

样例输入 #1
5 6
4 2 4 5 1
  • 1.
  • 2.
样例输出 #1
3
  • 1.

提示

对于【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ios_10的数据,有【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_11

对于【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_12的数据,有【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_13

对于【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_14的数据,有【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_15【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_03大于所有数的最大值,【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_02之和不超过【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ios_18

将数列如下划分:

【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_19

第一段和为【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_20,第【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ci_07段和为【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ios_22,第【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_23段和为【洛谷 P1181】数列分段 Section I 题解(贪心算法)_ios_22均满足和不超过【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_25,并可以证明【洛谷 P1181】数列分段 Section I 题解(贪心算法)_数据_23是最少划分的段数。


思路

从前往后遍历数列,每次将当前数加入已有的一段中,如果该段的和超过了 m,则将当前数新开一段。

定义两个变量 cnt 和 sum,分别表示当前已有的分段数和当前分段的和。初始时,cnt 为 1(最后一段),sum 为 0。遍历数列,对于每个数,如果将其加入当前分段后,分段和不超过 m,则将其加入当前分段中,更新 sum 的值。否则,将当前数新开一段,更新 cnt 和 sum 的值。最后输出 cnt 即可。


AC代码

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;

const int N = 1e5 + 5;

int main()
{
    int n, m;
    int a[N];
    int cnt, sum;
    cin >> n >> m;
    cnt = 1; // 最后一段
    sum = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
        if (sum + a[i] > m)
        {
            sum = a[i];
            cnt++;
        }
        else
        {
            sum += a[i];
        }
    }
    cout << cnt << endl;
    return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.