AtCoder Grand Contest 012: A - AtCoder Group Contest

,

http://agc012.contest.atcoder.jp/tasks/agc012_a

solution

貪欲。$O(N \log N)$。

強さが$x_1 \le x_2 \le x_3, \; y_1 \le y_2 \le y_3$な組$(x_1, x_2, x_3), \; (y_1, y_2, y_3)$があるとする。不等式を保ったまま適当に組み換えて$\max \{ x_1, y_1 \} \le \min \{ x_2, y_2 \}$にできて、このとき$x_2 + y_2$が最大で$y_3 \le x_2 \lor x_3 \le y_2$となる。 つまり長さが$3N$のとき、sortした後に組$(a_1, a_{3N-1}, a_{3N})$で作るのが最善。

implementation

#include <algorithm>
#include <cstdio>
#include <vector>
#define repeat(i, n) for (int i = 0; (i) < int(n); ++(i))
#define whole(f, x, ...) ([&](decltype((x)) whole) { return (f)(begin(whole), end(whole), ## __VA_ARGS__); })(x)
using ll = long long;
using namespace std;

int main() {
    int n; scanf("%d", &n);
    vector<int> a(3*n); repeat (i, 3*n) scanf("%d", &a[i]);
    whole(sort, a);
    ll result = 0;
    repeat (i, n) {
        result += a[3*n-1 - (2*i+1)];
    }
    printf("%lld\n", result);
    return 0;
}