Divide the Sequence
Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 424 Accepted Submission(s): 234
Problem Description
Alice has a sequence A, She wants to split A into as much as possible continuous subsequences, satisfying that for each subsequence, every its prefix sum is not small than 0.
Input
The input consists of multiple test cases.
Each test case begin with an integer n in a single line.
The next line contains n integers A1,A2⋯An .
1≤n≤1e6
−10000≤A[i]≤10000
You can assume that there is at least one solution.
Each test case begin with an integer n in a single line.
The next line contains n integers A1,A2⋯An .
1≤n≤1e6
−10000≤A[i]≤10000
You can assume that there is at least one solution.
Output
For each test case, output an integer indicates the maximum number of sequence division.
Sample Input
6 1 2 3 4 5 6 4 1 2 -3 0 5 0 0 0 0 0
Sample Output
6 2 5
其实简单,将读入的数据从后往前处理,每每读到一个负数就用前面的数来补足它,直到大于零为止,然后减去相应的分段个数。
复杂度O(n)
下面是代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int maxn = 1e6 + 5;
int save[maxn];
int main(){
int n,i,j;
while(~scanf("%d",&n)){
int result=n;
for(i=0;i<n;i++){
scanf("%d",&save[i]);
}
for(i=n-1;i>=0;i--){
if(save[i]<0){
for(j=i-1;;j--){
save[i] += save[j];
result--;
if(save[i]>=0){
i=j;
break;
}
}
}
}
printf("%d\n",result);
}
return 0;
}