AT_abc407_e [ABC407E] Most Valuable Parentheses [反悔贪心]

传送门

  • 此题与之前某一场div.2的D题一模一样(
  • 我们从后往前遍历,假如当前已经遍历了k个数,那么我们能选的数就有\(\left \lfloor \frac{k}{2}\right \rfloor\)个,所以假如当前优先队列中的数没有这么多,就直接选当前的数,如果已经选了这么多个数了,就看最小的是否比当前数小做选择即可。
#include<bits/stdc++.h>
    
using namespace std;
    
long long t;
const long long N = 5e5 + 10;
long long n,a[N];
    
void solve() {
    cin >> n;
    n = 2 * n;
    for(long long i = 1;i <= n;i++) cin >> a[i];
    priority_queue<long long,vector<long long>, greater<long long> > q;
    long long cnt = 0,ans = 0;
    for(long long i = n;i >= 1;i--) {
        cnt = (n - i + 1) / 2;
        if(q.size() < cnt) {
            q.push(a[i]);
            ans += a[i];
        }
        else if(!q.empty()) {
            if(q.top() < a[i]) {
                ans -= q.top();
                q.pop();
                q.push(a[i]);
                ans += a[i];
            }
        }
    }
    cout << ans << '\n';
}
    
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin >> t;
    while(t--) solve();
    
    return 0;
}
posted @ 2025-05-29 16:43  孤枕  阅读(46)  评论(0)    收藏  举报