题目链接:https://vijos.org/d/ybttg/p/5c24b6f3f41362c9e1912658
时间限制:1000 ms 内存限制:512 MiB

题目描述

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

输入格式

第一行包含两个正整数 N , M N,M N,M,表示了数列 A i A_i Ai的长度与每段和的最大值;

第二行包含 N N N个空格隔开的非负整数 A i A_i Ai

输出格式

输出文件仅包含一个正整数,输出最少划分的段数。

样例输入

5 6
4 2 4 5 1

样例输出

3

限制与提示

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

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

对于 100 % 100\% 100%的数据,有 N ≤ 1 0 5 , M ≤ 1 0 9 N \le 10^5, M \le 10^9 N105,M109 M M M大于所有数的最大值, A i A_i Ai之和不超过 1 0 9 10^9 109

解题思路

题意: 给你一个序列,求最少分成连续的几段,使其每段的和都不超过m。
思路: 直接从第一个数开始加,如果大于m就另起一段,否则就继续往下加。

Accepted Code:

/* 
 * @Author: lzyws739307453 
 * @Language: C++ 
 */
#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m, x;
    int cnt = 1, sum = 0;
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i++) {
        scanf("%d", &x);
        if (sum + x <= m)
            sum += x;
        else {
            cnt++;
            sum = x;
        }
    }
    printf("%d\n", cnt);
    return 0;
}