1070F : Debate

풀이

11을 모두 사용해주자.

0110을 모두 짝 지어주고

남은 01 또는 1000과 섞어서 값이 가장 큰 놈들을 최대한 사용해주자.

코드

#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;
}
wookje.kwon's profile image

wookje.kwon

2018-11-14 12:55

Read more posts by this author