题解
注意数列分段的题目不可以打乱顺序
原数列是[ 4 2 4 5 1 ]
划分为三段吼是 [ 4 2 ][ 4 ][ 5 1 ]
我们先从第一个开始,当前状态标记为 s ,一开始,s=a[1]
那么接下来从2开始枚举到n
如果当前状态加上一个数字仍然不超过最大限度m 的话,那就把这个数字加入当前状态,也就是不再开一个段数,否则就要新开一段了,同时重置状态s=a[ i ]
最后ans要自加,因为一开始的第一个没有算进去
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int n,m,ans,s; int a[100001]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); s=a[n]; for(int i=n-1;i>=1;i--) { if(s+a[i]<=m) s+=a[i]; else { ans++; s=a[i]; } } ans++; printf("%d",ans); return 0; }
原文:https://www.cnblogs.com/xiaoyezi-wink/p/10989514.html