$O(1)$
최대한 간단한 방법으로 필요한 판이 몇 개인지 구해보자.
필자의 풀이는 다음과 같다.
4,5,6 크기의 색종이는 한 장당 하나의 판이 필요하다. 그러므로 이 색종이들의 수만큼 답을 누적시키자.
이 종이들을 모퉁이부터 붙이면 여분이 남을 수 있다.
이 경우 1, 2 크기의 색종이를 붙일 수 있는 개수를 카운트 할 것인데 가능하면 2 크기의 색종이의 개수를 먼저 센다.
그 이유는 2 크기의 색종이를 나중에 1 크기의 색종이로 바꿀 수 있기 때문이다.
3 크기의 색종이를 4개보다 작게 분배하여 다른 작은 색종이와 같이 붙이면 비효율적이다.
따라서 3 크기의 색종이는 4개 이상 있으면 무조건 4개씩 묶어 판에 붙인다.
남는 3 크기의 색종이를 모퉁이부터 붙인다음 마찬가지로 2 크기 -> 1 크기 색종이 순으로 가능한 색종이 수를 카운트한다.
2 크기 색종이는 요구한 색종이 수와 카운트 한 값을 비교한다.
요구 값이 더 크면 넘치는 만큼 새로운 판에 붙이고 여분만큼 1 크기 색종이를 카운트 해주고
작다면 남은 2 크기 색종이 카운트 값을 1 크기 색종이의 카운트 값으로 바꾼다.(4배 하면 된다.)
마찬가지로 1크기 색종이 또한 요구 값과 카운트 값을 비교하여 필요한 판 수를 구해준다.
#include<cstdio> int a, b, c, d, e, f, r; int main() { scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &f); r = d + e + f; a -= 11 * e; b -= 5 * d; if (c) r += (c - 1) / 4 + 1, c %= 4; if (c) a -= 8 - c, b -= 7 - 2 * c; if (b>0) { r += (b - 1) / 9 + 1; a -= 36 - b % 9 * 4; } else a += b * 4; if (a>0) r += (a - 1) / 36 + 1; printf("%d", r); return 0; }
댓글 없음 :
댓글 쓰기