P1181 数列分段Section I
原创
©著作权归作者所有:来自51CTO博客作者不想悲伤到天明的原创作品,请联系作者获取转载授权,否则将追究法律责任
对于给定的一个长度为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;