abc160E 吃蘋果能得到的最大美味度

chenfy27發表於2024-03-10

有A個紅蘋果,美味度分別為p[i];有B個青蘋果,美味度分別為q[i];另外還有C個無色蘋果,美味度分別為r[i],無色蘋果在吃之前可以塗成紅色或青色。現在要吃X個紅蘋果和Y個青蘋果,求能吃到的最大美味度。
1<=X<=A<=1E5; 1<=Y<=B<=1E5; 1<=C<=1E5; 1<=p[i],q[i],r[i]<=1E9

反悔貪心,先不考慮無色蘋果,按要求吃美味度最大的紅蘋果和青蘋果,放到小根堆裡,然後用美味度更大的無色蘋果去替換堆裡的蘋果,使答案更優。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a; i<=b; i++)
#define per(i,a,b) for(int i=b; i>=a; i--)

const int N = 100005;
int X, Y, A, B, C, p[N], q[N], r[N];
void solve() {
    cin >> X >> Y >> A >> B >> C;
    rep(i,1,A) cin >> p[i];
    rep(i,1,B) cin >> q[i];
    rep(i,1,C) cin >> r[i];
    sort(p+1,p+1+A, [&](auto &x, auto &y) {return x > y;});
    sort(q+1,q+1+B, [&](auto &x, auto &y) {return x > y;});
    priority_queue<int,vector<int>,greater<>> pq;
    rep(i,1,X) pq.push(p[i]);
    rep(i,1,Y) pq.push(q[i]);
    rep(i,1,C) {
        auto t = pq.top();
        if (r[i] > t) {
            pq.pop();
            pq.push(r[i]);
        }
    }
    int ans = 0;
    while (!pq.empty()) {
        ans += pq.top();
        pq.pop();
    }
    cout << ans << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

相關文章