Submission #396462

#TimeUsernameProblemLanguageResultExecution timeMemory
396462KoDKitchen (BOI19_kitchen)C++17
100 / 100
26 ms972 KiB
#include <bits/stdc++.h>

template <class T>
using Vec = std::vector<T>;

constexpr int INF = std::numeric_limits<int>::max() / 2;
constexpr int MAX = 300 * 300;

int main() {
    int N, M, K;
    std::cin >> N >> M >> K;
    Vec<int> A(N);
    for (auto& x: A) {
        std::cin >> x;
        if (x < K) {
            std::cout << "Impossible\n";
            return 0;
        }
    }
    Vec<int> big, small;
    for (int i = 0; i < M; ++i) {
        int x;
        std::cin >> x;
        (x > N ? big : small).push_back(x);
    }
    std::array<int, MAX + 1> max;
    max.fill(-1);
    max[0] = 0;
    for (const auto x: big) {
        for (int i = MAX; i >= 0; --i) {
            if (max[i] == -1) {
                continue;
            }
            max[i + x] = std::max(max[i + x], max[i] + 1);
        }
    }
    std::bitset<MAX + 1> gain;
    gain.set(0);
    for (const auto x: small) {
        gain |= gain << x;
    }
    std::array<int, MAX + 1> lowb;
    lowb.fill(INF);
    for (int i = MAX; i >= 0; --i) {
        if (gain.test(i)) {
            lowb[i] = i;
        }
        if (i < MAX) {
            lowb[i] = std::min(lowb[i], lowb[i + 1]);
        }
    }
    const int whole = std::accumulate(A.begin(), A.end(), 0);
    int ans = INF;
    for (int i = 0; i <= MAX; ++i) {
        if (max[i] == -1) {
            continue;
        }
        const int rem1 = std::max(0, N * (K - max[i]));
        const int rem2 = std::max(0, whole - i);
        const int min = lowb[std::max(rem1, rem2)];
        if (min != INF) {
            ans = std::min(ans, min + i - whole);
        }
    }
    if (ans == INF) {
        std::cout << "Impossible\n";
    }
    else {
        std::cout << ans << '\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...