Submission #1270253

#TimeUsernameProblemLanguageResultExecution timeMemory
1270253duckpham27Topical (NOI23_topical)C++20
61 / 100
1094 ms134040 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; // ======================= SUBTASK 1 ======================= void solve_sub1(int n, int k, vector<vector<ll>> &r, vector<vector<ll>> &u) { bool ok = true; for (int j = 0; j < k; j++) { if (r[0][j] > 0) ok = false; } if (ok) cout << 1 << "\n"; else cout << 0 << "\n"; } // ======================= SUBTASK 2 ======================= // Brute-force cho n, k <= 100 void solve_sub2(int n, int k, vector<vector<ll>> &r, vector<vector<ll>> &u) { vector<ll> p(k, 0); vector<bool> done(n, false); int ans = 0; while (true) { bool progress = false; for (int i = 0; i < n; i++) { if (done[i]) continue; bool ok = true; for (int j = 0; j < k; j++) { if (p[j] < r[i][j]) { ok = false; break; } } if (ok) { done[i] = true; for (int j = 0; j < k; j++) p[j] += u[i][j]; ans++; progress = true; } } if (!progress) break; } cout << ans << "\n"; } // ======================= SUBTASK 3 ======================= // Greedy + heap cho k = 1 void solve_sub3(int n, int k, vector<vector<ll>> &r, vector<vector<ll>> &u) { vector<pair<ll, ll>> a(n); for (int i = 0; i < n; i++) { a[i] = {r[i][0], u[i][0]}; } sort(a.begin(), a.end()); // sort theo r[i] ll p = 0; int ans = 0; int idx = 0; priority_queue<ll> pq; while (true) { while (idx < n && a[idx].first <= p) { pq.push(a[idx].second); idx++; } if (pq.empty()) break; ll gain = pq.top(); pq.pop(); p += gain; ans++; } cout << ans << "\n"; } // ======================= SUBTASK 4 ======================= // Phiên bản chung (mô phỏng) - có thể chạy chậm với n, k rất lớn void solve_sub4(int n, int k, vector<vector<ll>> &r, vector<vector<ll>> &u) { vector<ll> p(k, 0); vector<bool> done(n, false); int ans = 0; while (true) { bool progress = false; for (int i = 0; i < n; i++) { if (done[i]) continue; bool ok = true; for (int j = 0; j < k; j++) { if (p[j] < r[i][j]) { ok = false; break; } } if (ok) { done[i] = true; for (int j = 0; j < k; j++) p[j] += u[i][j]; ans++; progress = true; } } if (!progress) break; } cout << ans << "\n"; } // ======================= MAIN ======================= int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; vector<vector<ll>> r(n, vector<ll>(k)); vector<vector<ll>> u(n, vector<ll>(k)); for (int i = 0; i < n; i++) { for (int j = 0; j < k; j++) cin >> r[i][j]; } for (int i = 0; i < n; i++) { for (int j = 0; j < k; j++) cin >> u[i][j]; } // Chia subtask if (n == 1) { solve_sub1(n, k, r, u); } else if (n <= 100 && k <= 100) { solve_sub2(n, k, r, u); } else if (k == 1) { solve_sub3(n, k, r, u); } else { solve_sub4(n, k, r, u); // fallback } 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...