题目描述
对于给定的一个长度为 �N 的正整数数列 ��Ai,现要将其分成连续的若干段,并且每段和不超过 �M(可以等于 �M),问最少能将其分成多少段使得满足要求。
输入格式
第一行包含两个正整数 �,�N,M,表示了数列 ��Ai 的长度与每段和的最大值;
第二行包含 �N 个空格隔开的非负整数 ��Ai。
输出格式
输出文件仅包含一个正整数,输出最少划分的段数。
样例
输入数据 1
5 6
4 2 4 5 1
Copy
输出数据 1
3
Copy
数据范围与提示
对于 20%20% 的数据,有�≤10N≤10;
对于 40%40% 的数据,有�≤1000N≤1000;
对于 100%100% 的数据,有 �≤105,�≤109N≤105,M≤109,�M 大于所有数的最大值。
此题要注意最后几个数的分段,不然答案会漏掉一个。然后模拟就行了。
ac代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<vector>
#include<math.h>
#include<iomanip>
#include<set>
#include<queue>
#include<stack>
#include<map>
using namespace std;
int n, m,ans=0,sum=0;//定义数列长度,和大小,答案,当前和
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)//按顺序读取值,判断当前和是否符合条件
{
int a;
cin >> a;
if (i == n - 1)//最后一个数时做一个特判,防止答案少1
{
if (sum < m)
ans++;
}
else if (a + sum == m)//等于直接答案++,sum置0
{
ans++;
sum = 0;
}
else if (a + sum > m)//大于就直接分段,sum赋值当前数
{
ans++;
sum = a;
}
else
{
sum = sum + a;
}
}
cout << ans;
}