Submission #896751

#TimeUsernameProblemLanguageResultExecution timeMemory
896751boxOlympiads (BOI19_olympiads)C++17
100 / 100
15 ms968 KiB
#include <bits/stdc++.h>
using namespace std;

#ifdef LOCAL
template <class T, class... U> void bug_h(const T& t, const U&... u) { cerr << t; ((cerr << " | " << u), ...); cerr << endl; }
#define bug(...) cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]: ", bug_h(__VA_ARGS__)
#else
#define cerr if (0) cerr
#define bug(...)
#endif

#define ar array
#define all(v) std::begin(v), std::end(v)
#define sz(v) int(std::size(v))
typedef long long i64;
typedef vector<int> vi;
typedef pair<int, int> pi;

using vb = vector<bool>;

int N, K, C;

struct event {
    int who, type, score;
    bool operator<(const event e) const {
        return score > e.score;
    }
};

vector<event> ev;

struct node {
    vb ban; vi use;
    int fix, score;
    node(vb ban, int fix) : ban(ban), fix(fix) {
        vb cover(K); int covered = 0;
        exchange(use, {}), score = 0;
        for (int i = 0; i < sz(ev) && covered < K && sz(use) < K; i++) {
            if (ban[ev[i].who] || cover[ev[i].type]) continue;
            score += ev[i].score;
            cover[ev[i].type] = 1, covered++;
            if (find(all(use), ev[i].who) == end(use)) use.push_back(ev[i].who);
        }
        for (int i = 0; i < sz(ev) && sz(use) < K; i++) {
            if (ban[ev[i].who]) continue;
            if (find(all(use), ev[i].who) == end(use)) use.push_back(ev[i].who);
        }
        // for (int x : use) cout << x << ' ';
        // cout << "=> " << score << endl;
    }
    bool operator<(const node v) const {
        return score < v.score;
    }
};

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> N >> K >> C;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < K; j++) {
            int v;
            cin >> v;
            ev.push_back({i, j, v});
        }
    }
    sort(all(ev));
    priority_queue<node> pq;
    pq.push(node(vb(N), 0));
    while (sz(pq)) {
        auto v = pq.top(); pq.pop();
        bug(v.score);
        if (--C == 0) {
            cout << v.score << '\n';
            return 0;
        }
        while (v.fix < K) {
            auto ban = v.ban; ban[v.use[v.fix]] = 1;
            node u(ban, v.fix);
            if (sz(u.use) == K) pq.push(u);
            v.fix++;
        }
    }
    cout << "-1\n";

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...