답안 #938717

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
938717 2024-03-05T13:15:40 Z Alebn Kitchen (BOI19_kitchen) C++14
0 / 100
48 ms 2396 KB
#include <bits/stdc++.h>
#define int long long
#define M 40

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]];
            }
        }
        //
        int res = LLONG_MAX;
        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 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 48 ms 2396 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Output isn't correct
2 Halted 0 ms 0 KB -