Submission #683593

#TimeUsernameProblemLanguageResultExecution timeMemory
683593four_specksOlympiads (BOI19_olympiads)C++17
100 / 100
69 ms1444 KiB
#include <bits/stdc++.h> using namespace std; namespace { template <typename T> bool ckmin(T &lhs, const T &rhs) { return rhs < lhs ? lhs = rhs, 1 : 0; } template <typename T> bool ckmax(T &lhs, const T &rhs) { return rhs > lhs ? lhs = rhs, 1 : 0; } } // namespace void solve() { int n, k, c; cin >> n >> k >> c, --c; vector a(n, vector<long>(k)); for (int i = 0; i < n; i++) { for (int l = 0; l < k; l++) cin >> a[i][l]; } auto eval = [&](const vector<bool> &ban) -> pair<long, vector<int>> { vector<int> take(k); vector<bool> done(n, 0); for (int l = 0; l < k; l++) { long x = -1; int j = -1; for (int i = 0; i < n; i++) { if (!ban[i] && !done[i]) { if (ckmax(x, a[i][l])) j = i; } } take[l] = j; done[j] = 1; } long score = 0; for (int l = 0; l < k; l++) { long x = 0; for (int m = 0; m < k; m++) ckmax(x, a[take[m]][l]); score += x; } return pair(score, take); }; priority_queue<tuple<long, int, vector<int>, vector<bool>, int>> pq; { vector<bool> ban(n, 0); auto [score, take] = eval(ban); pq.emplace(score, 0, take, ban, 0); } for (int i = 0, id = 1; i < c; i++) { auto [p_score, p_x, p_take, p_ban, p_nxt] = pq.top(); pq.pop(); int can = 0; for (int j = 0; j < n; j++) { if (!p_ban[j]) can++; } if (can - 1 < k) continue; vector ban = p_ban; for (int nxt = p_nxt; nxt < k; nxt++) { ban[p_take[nxt]] = 1; auto [score, take] = eval(ban); pq.emplace(score, id++, take, ban, nxt); ban[p_take[nxt]] = 0; } } long res = get<0>(pq.top()); cout << res << '\n'; } int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); solve(); 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...