풀이
11
을 모두 사용해주자.
01
과 10
을 모두 짝 지어주고
남은 01
또는 10
을 00
과 섞어서 값이 가장 큰 놈들을 최대한 사용해주자.
코드
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
int n, cnt, tot, sum;
vector<int> v[4];
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x, y;
scanf("%d %d", &x, &y);
if (x == 11) cnt++, tot++, sum += y;
if (x == 10) v[0].push_back(-y);
if (x == 01) v[1].push_back(-y);
if (x == 00) v[2].push_back(-y);
}
sort(v[0].begin(), v[0].end());
sort(v[1].begin(), v[1].end());
if (v[0].size() > v[1].size()) swap(v[0], v[1]);
for (int i = 0; i < v[0].size(); i++) {
sum -= v[0][i] + v[1][i];
tot += 2;
cnt++;
}
for (int i = v[0].size(); i < v[1].size(); i++) {
v[2].push_back(v[1][i]);
}
sort(v[2].begin(), v[2].end());
for (int i = 0; i < v[2].size() && tot < 2 * cnt; i++) {
tot++;
sum -= v[2][i];
}
printf("%d", sum);
return 0;
}