답안 #938718

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
938718 2024-03-05T13:19:10 Z vjudge1 Kitchen (BOI19_kitchen) C++17
20 / 100
74 ms 3668 KB
#include <bits/stdc++.h>
#define int long long
#define M 301

using namespace std;

int n, m, k, A = 0, B = 0, res = LLONG_MAX;
bool flag = false;
vector<int> a, b;
vector<vector<bool>> dp;

signed main() {
    cin >> n >> m >> k;
    a = vector<int>(n), b = vector<int>(m);
    for(int i = 0; i < n; i++) {
        cin >> a[i];
        A += a[i];
        if(a[i] < k) flag = true;
    }
    for(int i = 0; i < m; i++) {
        cin >> b[i];
        B += b[i];
    }
    if(k == 1) {
        dp = vector<vector<bool>>(m + 1, vector<bool>(B + 1, false));
        dp[0][0] = true;
        for(int i = 1; i <= m; i++) {
            for(int j = 0; j <= B; j++) {
                if(j >= b[i - 1]) dp[i][j] = dp[i - 1][j] | dp[i - 1][j - b[i - 1]];
            }
        }
        //
        for(int i = 0; i <= m; i++) {
            for(int j = A; j <= B; j++) {
                if(dp[i][j]) res = min(res, j - A);
            }
        }
    } else {
        // try every subset
        vector<int> diff;
        bitset<M> bin;
        int temp, sum;
        bool check;
        for(int i = 0; i < (1 << m); i++) {
            bin = bitset<M>(i), diff = vector<int>(n, k), sum = 0, check = true;
            for(int j = 0; j < M; j++) {
                if(bin[j]) {
                    sum += b[j];
                    temp = b[j];
                    for(int k = 0; k < n && temp; k++) {
                        if(diff[k]) {
                            diff[k]--;
                            temp--;
                        }
                    }
                }
            }
            for(int j = 0; j < n; j++) {
                if(diff[j]) {
                    check = false;
                    break;
                }
            }
            if(check && sum >= A) res = min(res, sum - A);
        }
    }
    if(flag || res == LLONG_MAX) cout << "Impossible\n";
    else cout << res << "\n";
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 52 ms 2552 KB Output is correct
2 Correct 38 ms 1884 KB Output is correct
3 Correct 42 ms 2140 KB Output is correct
4 Correct 74 ms 3668 KB Output is correct
5 Correct 70 ms 3484 KB Output is correct
6 Correct 31 ms 1624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Incorrect 0 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -