제출 #745886

#제출 시각아이디문제언어결과실행 시간메모리
745886vjudge1Kitchen (BOI19_kitchen)C++17
100 / 100
49 ms1036 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define mp make_pair #define pii pair<int, int> #define fi first #define se second void imp() { cout << "Impossible"; cout << "\n"; exit(0); } int n, m, k; vector<int> a, b; int sum_a; /*int try_4(int idx) { int pref = 0; for(int i = 0; i <= idx; i++) { pref += b[i]; } if(pref < sum_a) { return -1; } int sum1 = 0; for(int i = 0; i <= idx; i++) { sum1 += min(n, b[idx]); } if(sum1 < n * k) { return -1; } return pref - sum_a; }*/ void solve() { cin >> n >> m >> k; a.resize(n), b.resize(m); for(int &x : a) { cin >> x; sum_a += x; } sort(a.begin(), a.end()); for(int &x : b) { cin >> x; } sort(b.begin(), b.end()); reverse(b.begin(), b.end()); for(int i = 0; i < n; i++) { if(a[i] < k) { imp(); } } /*int l = -1, r = m; bool possible = false; int result = -42; while(l < r - 1) { int mid = (l + r) / 2; int res = try_4(mid); if(res != -1 && (result == -42 || result > res)) { result = res; } if(res != -1) { r = mid; } else { l = mid; } } if(r == m) { imp(); } cout << result << "\n";*/ int maxx = 300 * 300; vector<int> dp(1 + maxx, 0); vector<bool> is(1 + maxx, false); is[0] = true; for(int i = 1; i <= m; i++) { int val = b[i - 1]; int other_val = min(b[i - 1], n); for(int j = maxx; j >= val; j--) { if(is[j - val]) { is[j] = true; dp[j] = max(dp[j], dp[j - val] + other_val); } } } for(int i = sum_a; i <= maxx; i++) { if(is[i] && dp[i] >= n * k) { cout << i - sum_a << "\n"; return; } } imp(); } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); solve(); 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...