제출 #1193625

#제출 시각아이디문제언어결과실행 시간메모리
1193625yhx3Kitchen (BOI19_kitchen)C++20
0 / 100
1095 ms328 KiB
#include<bits/stdc++.h> #include<iostream> #include<vector> using namespace std; #define ll long long void rec(vector<int> &b, vector<vector<int>> &dp, vector<int> lst, int k, int &m, int sm) { if (k == 0) return; // if (!dp[sm].empty()) return; int str = lst.empty() ? 0 : lst.back()+1; for (int i = str; i < m-k+1; i++) { vector<int> cs(lst.begin(),lst.end()); cs.push_back(i); if (k == 1) dp[sm+b[i]] = cs; rec(b, dp,cs,k-1,m,sm+b[i]); } } void solve() { int n,m,k; cin >> n >> m >> k; vector<int> a(n); vector<int> b(m); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < m; i++) { cin >> b[i]; } if ((*min_element(a.begin(),a.end())) < k) { cout << "Impossible"; return; } sort(b.begin(),b.end(),greater<int>()); ll sm = 0; for (int i = 0; i < k; i++) { sm += b[i]; } sm = max(501LL,sm); vector<vector<int>> dp(sm,vector<int>()); vector<int> cs; rec(b,dp,cs,k,m,0); ll ans = 0; for (int i = 0; i < n; i++) { bool ok = false; for (int j = a[i]; j <= max(500LL,sm); j++) { if (!dp[j].empty()) { ans += j-a[i]; ok = true; break; } } if (!ok) { cout << "Impossible\n"; return; } } cout << ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(); int t = 1; // cin >> t; while (t--) { 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...