# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
853463 | 2023-09-24T11:54:26 Z | vjudge1 | Uplifting Excursion (BOI22_vault) | C++17 | 0 ms | 0 KB |
#include <bits/stdc++.h> using namespace std; #define endl "\n" void solve(){ long long M, L; cin >> M >> L; vector<int> val(2 * M + 1); for(int i = -M; i <= M; i++){ val[i + M] = i; } vector<long long> A(2 * M + 1); for(auto &i : A) cin >> i; if(L < 0){ L *= -1; for(int i = 0; i < M; i++){ swap(A[i], A[2 * M - i]); } } long long max_sum = 0; for(int i = M; i <= 2 * M; i++){ max_sum += val[i] * A[i]; } if(max_sum < L){ cout << "impossible" << endl; return; } vector<int> ans(max_sum + 1, -1); ans[0] = 0; for(int i = M + 1; i <= 2 * M; i++){ for(int _ = 0; _ < A[i]; _++){ for(int w = max_sum; w >= 0; w--){ if(ans[w] != -1) ans[w + val[i]] = max(ans[w + val[i]], ans[w] + 1); } } } for(int i = 0; i < M; i++){ for(int _ = 0; _ < A[i]; _++){ for(int w = val[i]; w <= max_sum; w++){ if(ans[w] != -1) ans[w + val[i]] = max(ans[w + val[i]], ans[w] + 1); } } } if(ans[L] == -1) cout << "impossible" << endl; else cout << ans[L] + A[M] << endl; } int main(){1048576 ios_base::sync_with_stdio(0); cin.tie(0); solve(); }