본문 바로가기
ps

[백준] 1493 - 박스 채우기

by kariskan 2022. 8. 26.

https://www.acmicpc.net/problem/1493

 

1493번: 박스 채우기

세준이는 length × width × height 크기의 박스를 가지고 있다. 그리고 세준이는 이 박스를 큐브를 이용해서 채우려고 한다. 큐브는 정육면체 모양이며, 한 변의 길이는 2의 제곱꼴이다. (1×1×1, 2×2×2,

www.acmicpc.net

 

채워야 하는 박스는 직육면체이고, 채우는 큐브는 정육면체 형태이다.

그래서 항상 큰 것부터 넣는 것이 그리디한 방법이라고 할 수 있겠다.

 

그래서 큰 것을 넣으면 어떻게 되는가?

만약 L * W * H 크기(L <= W <= H)의 박스에 a * a * a 크기의 큐브를 넣는다면,

 

(L - a) * W * H,

a * W * (H - a),

a * (W - a) * a

 

총 3개의 직육면체가 나오게 될것이다.

그래서 가장 큰 큐브부터 하나씩 써가며 칸을 채워나가면 된다.

 

#include <iostream>
#include <climits>
using namespace std;

int min(int a, int b, int c) {
	if (a <= b && a <= c) return a;
	if (b <= a && b <= c) return b;
	return c;
}

int n, a[21];

int go(int w, int m, int h) {
	
	if (w == 0 || m == 0 || h == 0)return 0;

	int idx = -1;

	for (int i = n - 1; i >= 0; i--) {
		if (a[i] && (1 << i) <= min(w, m, h)) {
			idx = i;
			break;
		}
	}

	if (idx == -1) {
		cout << -1;
		exit(0);
	}

	int c = 1 << idx;
	a[idx]--;
	int ret = go(w - c, m, h) + go(c, m, h - c) + go(c, m - c, c) + 1;
	return ret;
}

int main() {
	int l, m, h;
	cin >> l >> m >> h >> n;

	for (int i = 0; i < n; i++) {
		int c, b; cin >> c >> b;
		a[c] = b;
	}

	cout << go(l, m, h);
}

'ps' 카테고리의 다른 글

[백준] 2473 - 세 용액  (0) 2022.08.26
[백준] 1761 - 정점들의 거리  (0) 2022.08.26
[백준] 1374 - 강의실  (0) 2022.08.26
[백준] 19236 - 청소년 상어  (0) 2022.08.22
[백준] 1083 - 소트  (0) 2022.08.22

댓글