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

输入输出格式

输入格式:

 

第1行包含两个正整数N,M表示了数列Ai的长度与每段和的最大值,第2行包含N个空格隔开的非负整数Ai,如题目所述。

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 复制


5 6 4 2 4 5 1


输出样例#1: 复制


3


说明

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

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

对于100%的数据,有N≤100000,M≤109,M大于所有数的最小值,Ai之和不超过10^9。

将数列如下划分:

[4][24][51]

第一段和为4,第2段和为6,第3段和为6均满足和不超过M=6,并可以证明3是最少划分的段数。

从左到右尽可能的选.

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <set>
#include <cstring>
#include <stack>
#include <set>
#include <vector>
#include <queue>
#define Swap(a,b) a ^= b ^= a ^= b
#define cl(a,b) memset(a,b,sizeof(a))
using namespace std ;
typedef long long LL;
const int N = 1e7+10 ;

LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
LL lcm(LL a,LL b){return a/gcd(a,b)*b;}
const int MAX = 200005;
const int inf = 0xffffff;
const LL mod = 1e9+7 ;
priority_queue<int,vector<int>,greater<int> > q ;// 小跟堆
priority_queue<int> Q ; // 大堆

int a[MAX] ;
int s[MAX] ;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL),cout.tie(NULL);
int n , m ;
int cnt = 0 ;
cin >> n >>m ;
for(int i = 1 ; i<=n ;i++){
cin >>a[i] ;
}
int ans = 0 ;

for(int i = 1 ; i<=n ; ){
ans = 0 ;
while(a[i]+ans <=m ){
ans+=a[i] ;
i++ ;
}
s[cnt++]= ans ;
}
cout<<cnt<<endl;



return 0;
}

但是 把上面 改为下面就 RE 了, 不知道为什么? 

while(a[i]+ans <=m ){
ans+=a[i] ;
i++ ;
}
cnt++;
}
cout<<cnt<<endl;