Submission #229206

#TimeUsernameProblemLanguageResultExecution timeMemory
229206dolphingarlicOlympiads (BOI19_olympiads)C++14
100 / 100
112 ms1716 KiB
#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;

struct Frag {
    int score;
    vector<int> best, forced;
    vector<bool> forbidden;
};

bool operator<(Frag A, Frag B) { return A.score < B.score; }

int n, k, c, stud[500][6];

Frag fill_best(Frag init) {
    init.best = init.forced;
    init.score = 0;
    FOR(i, init.best.size(), k) {
        init.best.push_back(-1);
        FOR(j, 0, n)
            if (!init.forbidden[j] && find(init.best.begin(), init.best.end(), j) == init.best.end())
                if (init.best[i] == -1 || stud[init.best[i]][i] < stud[j][i])
                    init.best.pop_back(), init.best.push_back(j);
    }
    vector<int> event_best(k, 0);
    FOR(i, 0, k) if (~init.best[i]) FOR(j, 0, k) event_best[j] = max(event_best[j], stud[init.best[i]][j]);
    FOR(i, 0, k) init.score += event_best[i];
    return init;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> k >> c;
    FOR(i, 0, n) FOR(j, 0, k) cin >> stud[i][j];
    priority_queue<Frag> pq;
    pq.push(fill_best({0, {}, {}, vector<bool>(n, false)}));
    while (c--) {
        Frag curr = pq.top();
        pq.pop();

        if (!c) cout << curr.score;
        FOR(i, curr.forced.size(), k) {
            curr.forbidden[curr.best[i]] = true;
            Frag nxt = fill_best(curr);
            if (find(nxt.best.begin(), nxt.best.end(), -1) == nxt.best.end())
                pq.push(nxt);
            curr.forbidden[curr.best[i]] = false;
            curr.forced.push_back(curr.best[i]);
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...