제출 #584302

#제출 시각아이디문제언어결과실행 시간메모리
584302talant117408Kitchen (BOI19_kitchen)C++17
9 / 100
123 ms3924 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair <int, int> pii; typedef pair <ll, ll> pll; #define long unsigned long #define pb push_back #define mp make_pair #define all(v) (v).begin(),(v).end() #define rall(v) (v).rbegin(),(v).rend() #define lb lower_bound #define ub upper_bound #define sz(v) int((v).size()) #define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl '\n' vector <bitset <100001>> dp(301); void impossible() { cout << "Impossible" << endl; exit(0); } void solve() { int n, m, k; cin >> n >> m >> k; vector <int> a(n), b, tmp; for (auto &to : a) cin >> to; for (int i = 0; i < m; i++) { int x; cin >> x; tmp.pb(x); } if (m < k) impossible(); sort(all(tmp)); b.pb(0); for (int i = 0; i < m; i++) { b.back() += tmp[i]; if (b.back() >= n) { b.pb(0); } } if (b.back() < n) b.pop_back(); m = sz(b); int dishes = 0, chefs = 0; for (auto to : a) dishes += to; for (auto to : b) chefs += to; for (auto to : a) { if (to < k) impossible(); } //~ int ans = 1e9; //~ for (int c = k; c <= m; c++) { //~ for (int i = 0; i < m; i++) { //~ for (int j = i + c - 1; j < m; j++) { //~ int saizu = j - i + 1; //~ vector <int> pref(saizu), suff(saizu); //~ pref[0] = b[i]; //~ for (int l = 1; l < saizu; l++) { //~ pref[l] = pref[l - 1] + b[i + l]; //~ } //~ suff[saizu - 1] = b[j]; //~ for (int l = saizu - 2; l >= 0; l--) { //~ suff[l] = suff[l + 1] + b[i + l]; //~ } //~ if (dishes <= pref[c - 1]) { //~ ans = min(ans, pref[c - 1] - dishes); //~ } //~ if (dishes <= suff[saizu - c]) { //~ ans = min(ans, suff[saizu - c] - dishes); //~ } //~ for (int l = 1; l < c; l++) { //~ if (dishes <= pref[l] + suff[saizu - c + l]) { //~ ans = min(ans, pref[l] + suff[saizu - c + l] - dishes); //~ } //~ } //~ } //~ } //~ } dp[0][0] = 1; for (int i = 0; i < m; i++) { for (int c = m; c >= 1; c--) { dp[c] |= (dp[c - 1] << b[i]); } } int ans = 1e9; for (int c = k; c <= m; c++) { for (int i = dishes; i <= chefs; i++) { if (dp[c][i]) { ans = min(ans, i - dishes); } } } if (ans >= 1e9) impossible(); cout << ans; } int main() { do_not_disturb 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...