ABC160 E Red and Green Apples

ABC160 E Red and Green Apples

問題概要

リンク参照

考察

  • 無色のものがないなら,赤を大きいほうからX個,緑を大きいほうからY個選べば良さそう.
  • 無色の扱いをどうしよう...(´・ω・`)
  • 赤にも緑にもなるのなら,赤を大きいほうからX個,緑を大きいほうからY個選んだあとで,無色リンゴよりも美味しさが小さいものを除いて無色リンゴを着色して入れ替えれば条件を満たしたまま最大化できそう
  • 貪欲....

ソースコード

#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;

}