페이지

2590번: 색종이

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


$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;
}

댓글 없음 :

댓글 쓰기