Submission #938739

#TimeUsernameProblemLanguageResultExecution timeMemory
938739vjudge1Kitchen (BOI19_kitchen)C++17
29 / 100
72 ms3672 KiB
#include <bits/stdc++.h> #define int long long #define M 302 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 || m <= 15) { // 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"; } else { 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]]; //cout << dp[i][j] << " "; } //cout << "\n"; } // 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); } } if(res == LLONG_MAX) cout << "Impossible\n"; else cout << res << "\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...