
解析:
sum每次累计序列值,并且将负数放入优先队列。当sum变为负数时,不断弹出最小的负数使sum变为正数,并且维护sum中的数字个数。
- #include
- 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<
- return 0;
- }