Submission #1331038

#TimeUsernameProblemLanguageResultExecution timeMemory
1331038edoOlympiads (BOI19_olympiads)C++20
31 / 100
58 ms18876 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

struct State {
    int ub;
    int idx;
    int picked;
    int mx[6];
    bool operator<(const State& o) const {
        return ub < o.ub;
    }
};

int n, k, c;
int a[501][6];
int s[501][6];

priority_queue<State> q;

int calc(int idx, int picked, int curr[]) {
    if(picked == k) {
        int sum = 0;
        for(int i = 0; i < k; i++) sum += curr[i];
        return sum;
    }
    int res = 0;
    assert(idx <= n); 
    for(int i = 0; i < k; i++) {
        res += max(curr[i], s[idx][i]);
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> k >> c;
    vector<pair<int, vector<int>>> A(n);
    for(int i = 0; i < n; i++) {
        int sum = 0; vector<int> tmp(k);
        for(int j = 0; j < k; j++) {
            cin >> tmp[j];
            sum += tmp[j]; 
        }
        A[i] = {sum, tmp};
    }

    sort(A.rbegin(), A.rend());
    for(int i = 0; i < n; i++) 
        for(int j = 0; j < k; j++) 
            a[i][j] = A[i].second[j];

    for(int i = n - 1; ~i; i--) 
        for(int j = 0; j < n; j++)
            s[i][j] = max(s[i + 1][j], a[i][j]);

    State initial;
    initial.idx = 0;
    initial.picked = 0;
    memset(initial.mx, 0, sizeof(initial.mx));
    initial.ub = calc(0, 0, initial.mx);
    q.push(initial);

    int cnt = 0;
    while(!q.empty()) {
        State cur = q.top();
        q.pop();
        if(cur.picked == k) {
            cnt++;
            if(cnt == c) {
                cout << cur.ub;
                return 0;
            }
            continue;
        }

        if(cur.idx >= n) continue;

        if(cur.picked < k) {
            State nxt;
            nxt.idx = cur.idx + 1;
            nxt.picked = cur.picked + 1;
            for(int j = 0; j < k; j++) nxt.mx[j] = max(cur.mx[j], a[cur.idx][j]);
            nxt.ub = calc(nxt.idx, nxt.picked, nxt.mx);

            q.push(nxt);
        }

        if(n - cur.idx - 1 >= k - cur.picked) {
            State nxt = cur;
            nxt.idx++;
            nxt.ub = calc(nxt.idx, nxt.picked, nxt.mx);
            q.push(nxt); 
        }
    }

    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...