제출 #1190040

#제출 시각아이디문제언어결과실행 시간메모리
1190040crafticatKitchen (BOI19_kitchen)C++20
0 / 100
1092 ms9460 KiB
#include <bits/stdc++.h> using namespace std; #define F0R(i, n) for (int i = 0; i < n;i++) #define FOR(i, j, n) for(int i = j; i < n;i++) template<typename T> using V = vector<T>; using vi = V<int>; constexpr int INF = 1e9; int eval(int n, int m, int k, vi a, vi b) { int sumB = 0, sumA = 0; for (auto x : b) sumB += x; for (auto x : a) sumA += x; F0R(i, m) { if (b[i] < k) { cout << "Impossible\n"; return 0; } } int BOUND = max(sumB, sumA) + 1; auto dp(V<vi>(BOUND,vi(k + 1,-INF))); dp[0][0] = 0; FOR(i, 1, n + 1) { auto newDp = dp; newDp[0][0] = 0; FOR(j, 1, BOUND) { FOR(t, 0, k + 1) { if (j - a[i - 1] < 0) continue; int oldSum = j - a[i - 1]; if (t > 0 && dp[oldSum][t - 1] + a[i - 1] >= m) newDp[j][t] = max(newDp[j][t], 0); newDp[j][t] = max(newDp[j][t], dp[oldSum][t] + a[i - 1]); } } dp = newDp; } FOR(i, sumB, BOUND) { if (dp[i][k] >= 0) { return i - sumB; } } return -1; } int eval2(int n, int m, int k, vi a, vi b) { int sumB = 0, sumA = 0; for (auto x : b) sumB += x; for (auto x : a) sumA += x; F0R(i, m) { if (b[i] < k) { return -1; } } int BOUND = max(sumB, sumA) + 1; vi dp(BOUND, -INF); dp[0] = 0; F0R(i, n) { vi newDp = dp; F0R(j, BOUND) { if (j - a[i] >= 0) newDp[j] = max( dp[j - a[i]], dp[j]); } dp = newDp; } FOR(i, sumB, BOUND) { if (dp[i] >= 0) { return i - sumB; } } return -1; } #ifndef DEBUG int main() { int n, m, k; cin >> n >> m >> k; vi a(n), b(m); F0R(i, n) cin >> a[i]; F0R(i, m) cin >> b[i]; swap(a, b); swap(m, n); int res = eval(n, m, k, a, b); if (res == -1) cout << "Impossible\n"; else cout << res << endl; } #endif #if DEBUG int rand(int a, int b) { return a + rand() % (b - a + 1); } int main() { int test = 0; while (1) { test++; int n = rand(1 ,50), m = rand(1, 50), k = 1; vi a(n), b(m); F0R(i, n) a[i] = rand(1, 50); F0R(i, m) b[i] = rand(1, 50); swap(a, b); swap(m, n); int v1 = eval(n, m, k, a, b); int v2 = eval2(n, m, k, a, b); if (v1 != v2) { int stop = 25; eval2(n, m, k, a, b); eval(n, m, k, a, b); } else { cout << "succ"; } } } #endif
#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...