https://www.acmicpc.net/problem/1493
1493번: 박스 채우기
세준이는 length × width × height 크기의 박스를 가지고 있다. 그리고 세준이는 이 박스를 큐브를 이용해서 채우려고 한다. 큐브는 정육면체 모양이며, 한 변의 길이는 2의 제곱꼴이다. (1×1×1, 2×2×2,
www.acmicpc.net
[ 풀이 ]
큐브들은 모두 작은걸로 큰걸 채울 수 있다. 따라서 그리디하게 길이에 맞는 가장 큰 큐브부터 사용하면 된다.
(각 큐브가 작은것으로 큰걸 채우지 못하면 그리디를 사용할 수 없다.)
큐브를 사용했다면 박스는 세 부분으로 나뉜다. 이제 이 세부분으로 divide&conquer 해주면 된다.
[ Code ]
#include <bits/stdc++.h>
using namespace std;
int a, b, c, u, v, n, cube[22], ans = 0;
// 길이 x, y, z인 박스 나누기
void go(int x, int y, int z) {
if (!x || !y || !z) return;
int k = min({ x, y, z });
int idx = (int)log2(k);
int flag = 0;
// 길이에 맞는 제일 큰 큐브 선택
for (int i = idx; i >= 0; i--) {
if (cube[i]) {
flag = 1;
idx = i;
break;
}
}
//없다면 채울 수 없다.
if (!flag) {
cout << -1;
exit(0);
}
// 채웠다면
ans++, cube[idx]--;
int len = 1 << idx;
go(x - len, y, z);
go(len, y, z - len);
go(len, y - len, len);
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> a >> b >> c >> n;
for (int i = 0; i < n; i++) {
cin >> u >> v;
cube[u] = v;
}
go(a, b, c);
cout << ans;
}'PS > BOJ' 카테고리의 다른 글
| 백준 11670 / C++ (0) | 2022.08.17 |
|---|---|
| 백준 1028 / C++ (0) | 2022.08.12 |
| 백준 11616 / C++ (0) | 2022.08.12 |
| 백준 12911 / C++ (0) | 2022.08.12 |
| 백준 25112 / C++ (0) | 2022.08.12 |
댓글