题目链接: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 N≤10;
对于 40 % 40\% 40%的数据,有 N ≤ 1000 N \le 1000 N≤1000;
对于 100 % 100\% 100%的数据,有 N ≤ 1 0 5 , M ≤ 1 0 9 N \le 10^5, M \le 10^9 N≤105,M≤109, 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;
}