Submission #645885

#TimeUsernameProblemLanguageResultExecution timeMemory
645885alextodoranKitchen (BOI19_kitchen)C++17
100 / 100
21 ms664 KiB
/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N_MAX = 300;
const int M_MAX = 300;
const int T_MAX = 300;
const int INF = INT_MAX / 2;

int N, M, K;
int A[N_MAX + 2];
int B[M_MAX + 2];
int sumA, sumB;

int dp[M_MAX * T_MAX + 2];

int main () {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N >> M >> K;
    for (int i = 1; i <= N; i++) {
        cin >> A[i];
        sumA += A[i];
    }
    for (int i = 1; i <= M; i++) {
        cin >> B[i];
        sumB += B[i];
    }

    for (int i = 1; i <= N; i++) {
        if (A[i] < K) {
            cout << "Impossible\n";
            return 0;
        }
    }

    fill(dp + 1, dp + sumB + 1, -INF);
    for (int i = 1; i <= M; i++) {
        for (int t = sumB; t >= B[i]; t--) {
            dp[t] = max(dp[t], dp[t - B[i]] + min(B[i], N));
        }
    }
    int sum = sumA;
    while (sum <= sumB && dp[sum] < N * K) {
        sum++;
    }
    if (sum > sumB) {
        cout << "Impossible\n";
    } else {
        cout << sum - sumA << "\n";
    }

    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...
#Verdict Execution timeMemoryGrader output
Fetching results...