题意:给出一个序列,求出最多可以分割成多少个前缀和非负的序列。
题解:贪心,碰到负数就往前合并区间。
#include <iostream>
#include <math.h>
#include<vector>
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
class Solution{
vector<int> d,dp;
vector<LL> s;
int n;
public:
void solve(){
while(scanf(" %d",&n)==1){
d = vector<int>(n+1);
s = vector<LL>(n+1);
vector<pii> pd;
for(int i=1;i<=n;i++){
scanf(" %d",&d[i]);
s[i]=s[i-1]+d[i];
}
for(int i=1;i<=n;i++){
int su = d[i];
int j = i;
while(su<0){
pii c = pd.back();
pd.pop_back();
su+=s[c.second]-s[c.first-1];
j = c.first;
}
pd.push_back(make_pair(j,i));
}
printf("%d\n",pd.size());
}
}
};
int main() {
//cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
(new Solution())->solve();
return 0;
}