제출 #530125

#제출 시각아이디문제언어결과실행 시간메모리
530125fatemetmhrKitchen (BOI19_kitchen)C++17
100 / 100
26 ms1112 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define fi first #define se second #define all(x) x.begin(), x.end() const int maxn5 = 7e3 + 10; const ll inf = 1e18; const int masum = 1e5 + 10; ll a[maxn5], b[maxn5]; ll n, m, k; ll dp[masum]; inline void solve(){ fill(dp, dp + masum, -inf); dp[0] = 0; for(int i = 0; i < m; i++){ for(int j = masum - 1; j >= b[i]; j--){ dp[j] = max(dp[j], dp[j - b[i]] + min(n, b[i])); } } ll sum = 0; for(int i = 0; i < n; i++) sum += a[i]; for(int i = sum; i < masum; i++) if(dp[i] >= n * k){ cout << i - sum << '\n'; exit(0); } cout << "Impossible" << endl; exit(0); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> m >> k; ll sum = 0; for(int i = 0; i < n; i++){ cin >> a[i]; if(a[i] < k) return cout << "Impossible" << endl, 0; sum += a[i]; } for(int i = 0; i < m; i++) cin >> b[i]; if(true) solve(); ll ans = inf; for(int mask = 0; mask < (1 << m); mask++) if(__builtin_popcount(mask) >= k){ ll sum1 = 0, sum2 = 0; for(int i = 0; i < m; i++) if((mask >> i)&1){ sum1 += min(n, b[i]); sum2 += b[i]; } if(sum1 >= n * k && sum2 >= sum && ans >= sum2){ ans = sum2; //cout << mask << ' ' << sum1 << ' ' << sum2 << endl; } } if(ans == inf) cout << "Impossible" << endl; else cout << ans - sum << endl; }
#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...