分析:用一个优先队列存储奖励牌,遇到0(英雄牌)时取出上面最大的牌加上。
优先队列:底层结构为二叉树,与队列类似但每次能按优先级处理,less从大到小排序优先大的,greater从小到大排序优先小的。
定义priority_queue<int,vector<int>,less<int>>v;
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
void slove(){
priority_queue<int,vector<int>,less<int>>v;
while(!v.empty())v.pop();
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
int ans=0;
for(int i=1;i<=n;i++){
if(a[i]!=0)v.push(a[i]);
else {
if(!v.empty())ans+=v.top(),v.pop();
}
}
cout<<ans<<endl;
}
signed main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int t;
cin>>t;
while(t--){
slove();
}
return 0;
}