Submission #1189953

#TimeUsernameProblemLanguageResultExecution timeMemory
1189953crafticatKitchen (BOI19_kitchen)C++20
0 / 100
1094 ms9456 KiB
#include <bits/stdc++.h>

using namespace std;
#define F0R(i, n) for (int i = 0; i < n;i++)
#define FOR(i, j, n) for(int i = j; i < n;i++)

template<typename T>
using V = vector<T>;
using vi = V<int>;

constexpr int INF = 1e9;

int main() {
    int n, m, k; cin >> n >> m >> k;

    vi a(n), b(m);
    int sumB = 0, sumA = 0;

    F0R(i, n)
        cin >> a[i];
    F0R(i, m)
        cin >> b[i];
    swap(a, b);
    swap(m, n);

    for (auto x : b)
        sumB += x;
    for (auto x : a)
        sumA += x;

    F0R(i, m) {
        if (b[i] < k) {
            cout << "Impossible\n";
            return 0;
        }
    }

    int BOUND = max(sumB, sumA) + 1;
    auto dp(V<vi>(BOUND,vi(k + 1,-INF)));

    dp[0][0] = 0;
    FOR(i, 1, n + 1) {
        auto newDp = dp;

        newDp[0][0] = 0;
        FOR(j, 1, BOUND) {
            FOR(t, 0, k + 1) {
                if (j - a[i - 1] < 0) continue;

                int oldSum = j - a[i - 1];
                if (t > 0 && dp[oldSum][t - 1] + a[i - 1] >= m)
                    newDp[j][t] = max(newDp[j][t], 0);

                newDp[j][t] = max(newDp[j][t], dp[oldSum][t] + a[i - 1]);
            }
        }
        dp = newDp;
    }

    FOR(i, sumB, BOUND) {
        if (dp[i][k - 1] >= 0) {
            cout << i - sumB << endl;
            return 0;
        }
    }

    cout << "Impossible\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...