解析:
sum每次累计序列值,并且将负数放入优先队列。当sum变为负数时,不断弹出最小的负数使sum变为正数,并且维护sum中的数字个数。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+5;
int n,a[N],sum;
priority_queue<int,vector<int>,greater<int>>q;
signed main(){
scanf("%lld",&n);
int cnt=0,res=0;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
if(a[i]<0) q.push(a[i]);
sum+=a[i]; //累计当前总和
cnt++;
while(sum<0){ //sum变为负数,则不断弹出最小的负数
sum-=q.top();
q.pop();
cnt--;
}
res=max(res,cnt); //统计最大数量
}
cout<<res;
return 0;
}