# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1002163 | vjudge1 | 은행 (IZhO14_bank) | C++17 | 78 ms | 17696 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
#define bw(i, a, b) for (auto i = a; i >= b; i--)
#define fw(i, a, b) for (auto i = a; i <= b; i++)
//Road to Expert: 180 pts left
void solve() {
int n, m; scanf("%d %d", &n, &m);
int a[n], b[m];
fw(i, 0, n - 1) scanf("%d", &a[i]);
fw(i, 0, m - 1) scanf("%d", &b[i]);
std::pair<int, int> dp[(1 << m)];
int vis[(1 << m)];//used bit
memset(vis, 0, sizeof(vis));
vis[0] = 1;
dp[0] = {0, 0};
std::vector<std::vector<int>> masks(30);
fw(i, 0, (1 << m) - 1) masks[__builtin_popcount(i)].push_back(i);
fw(i, 0, m) {
for (auto mask : masks[i]) {
if (vis[mask]) {
if (dp[mask].first == n) {
printf("YES");
return;
}
int cp = dp[mask].first;
fw(j, 0, m - 1) {
int mask2 = mask | (1 << j);
if (mask - mask2) {
if (dp[mask].second + b[j] > a[cp]) continue;
vis[mask2] = 1;
dp[mask2] = {cp, dp[mask].second + b[j]};
if (a[cp] == dp[mask].second + b[j]) dp[mask2] = {cp + 1, 0};
}
}
}
}
}
printf("NO");
}
signed main() {
// freopen("", "r", stdin);
// freopen("", "w", stdout);
int T_ = 1;
// scanf("%d", &T_);
while (T_--) solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |