ABC160 E Red and Green Apples
ABC160 E Red and Green Apples
問題概要
リンク参照
考察
- 無色のものがないなら,赤を大きいほうから個,緑を大きいほうから個選べば良さそう.
- 無色の扱いをどうしよう...(´・ω・`)
- 赤にも緑にもなるのなら,赤を大きいほうから個,緑を大きいほうから個選んだあとで,無色リンゴよりも美味しさが小さいものを除いて無色リンゴを着色して入れ替えれば条件を満たしたまま最大化できそう
- 貪欲....
ソースコード
#include<algorithm> #include<bitset> #include<cassert> #include<cfloat> #include<climits> #include<cmath> #include<deque> #include<functional> #include<iomanip> #include<iostream> #include<map> #include<queue> #include<set> #include<stack> #include<string> #include<unordered_map> #include<unordered_set> #include<utility> #include<vector> using namespace std; typedef long long int ll; /******************************************************************************************/ int main() { cin.tie(0); ios::sync_with_stdio(false); cout << fixed << setprecision(10); ll x, y, a, b, c; cin >> x >> y >> a >> b >> c; vector<ll> p(a), q(b), r(c); for (int i = 0; i < a; i++) { cin >> p[i]; } for (int i = 0; i < b; i++) { cin >> q[i]; } for (int i = 0; i < c; i++) { cin >> r[i]; } sort(p.rbegin(), p.rend()); sort(q.rbegin(), q.rend()); sort(r.rbegin(), r.rend()); priority_queue<ll> M; for (int i = 0; i < x; i++) { M.push(p[i]); } for (int i = 0; i < y; i++) { M.push(q[i]); } for (int i = 0; i < c; i++) { M.push(r[i]); } ll ans = 0; ll cnt = 0; while (!M.empty()) { ans += M.top(); M.pop(); cnt++; if (cnt == x + y) { break; } } cout << ans << endl; return 0; }