Submission #1199831

#TimeUsernameProblemLanguageResultExecution timeMemory
1199831ofozTopical (NOI23_topical)C++17
61 / 100
1093 ms126488 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

// Equivalent to the Python `higher` function
bool higher(const vector<int>& a, const vector<int>& b) {
    assert(a.size() == b.size());
    for (size_t i = 0; i < a.size(); ++i) {
        if (b[i] > a[i]) return false;
    }
    return true;
}

void kOne(int n, int k) {
    vector<vector<int>> grid(n, vector<int>(k));
    vector<vector<int>> ben(n, vector<int>(k));

    for (int i = 0; i < n; ++i)
        for (int j = 0; j < k; ++j)
            cin >> grid[i][j];

    for (int i = 0; i < n; ++i)
        for (int j = 0; j < k; ++j)
            cin >> ben[i][j];

    vector<pair<int, int>> pairs;
    for (int i = 0; i < n; ++i)
        pairs.push_back({grid[i][0], ben[i][0]});

    sort(pairs.begin(), pairs.end());
    reverse(pairs.begin(), pairs.end());
    int cur = 0, res = 0;
    while (!pairs.empty() && cur >= pairs.back().first) {
        cur += pairs.back().second;
        pairs.pop_back();
        res++;
    }

    cout << res << endl;
}

void solve() {
    int n, k;
    cin >> n >> k;
    if (k == 1) {
        kOne(n, k);
        return;
    }
    vector<int> cur(k, 0);  // Current values
    vector<pair<vector<int>, int>> a;  // Vector of (arr, index)
    vector<vector<int>> b(n);          // Second matrix

    // Read 'a'
    for (int i = 0; i < n; ++i) {
        vector<int> temp(k);
        for (int j = 0; j < k; ++j) {
            cin >> temp[j];
        }
        a.push_back({temp, i});
    }

    // Read 'b'
    for (int i = 0; i < n; ++i) {
        b[i].resize(k);
        for (int j = 0; j < k; ++j) {
            cin >> b[i][j];
        }
    }

    int res = 0;
    for (int iter = 0; iter < n; ++iter) {
        bool found = false;
        vector<pair<vector<int>, int>> nxt;

        for (const auto& p : a) {
            const vector<int>& arr = p.first;
            int i = p.second;

            if (found) {
                nxt.push_back(p);
                continue;
            }

            if (higher(cur, arr)) {
                for (int j = 0; j < k; ++j) {
                    cur[j] += b[i][j];
                }
                found = true;
                ++res;
                continue;
            }

            nxt.push_back(p);
        }

        a = nxt;
    }

    cout << res << endl;
}

signed main() {
    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...