클럽 홀

시간 제한2초메모리 제한512 MB

요약
직사각형 홀과 여러 널빤지 길이가 주어질 때, 각 줄을 한 개 또는 두 개의 널빤지로 채울 수 있는지 판단하고 바닥을 덮는 최소 널빤지 수를 구한다.
난이도

보통10점 중 7점

유형
그리디, 정렬, 투 포인터, 구현
정답자
아직 제출이 없습니다

문제

칭구아 레크리에이션 클럽이 새 회관을 짓고 있다. 회원들은 회관 홀 바닥을 나무 판자로 깔기를 원한다. 클럽의 유명한 무도회에는 판자 바닥이 가장 좋다고 생각하기 때문이다. 이 지역의 한 목재소가 바닥에 쓸 품질 좋은 판자를 많이 기증했다. 기증된 판자는 모두 폭이 같지만 길이는 서로 다르다.

홀 바닥은 직사각형이다. 판자는 서로 겹치는 부분 없이 나란히 붙여 놓아야 하며, 홀 바닥 전체를 덮어야 한다. 판자는 길이 방향으로 줄을 맞추어 놓아야 하고 모두 같은 방향이어야 한다. 즉 모든 판자는 길이 방향으로 서로 평행하다. 또한 회원들은 바닥에 이음매가 많은 것을 원하지 않는다. 그래서 판자 하나가 홀의 한쪽 벽에서 반대쪽 벽까지 닿을 만큼 길지 않으면, 그 판자는 다른 판자 최대 한 개와 이어 붙여 거리를 채울 수 있다. 따라서 판자 한 줄은 길이가 홀의 한 변과 같은 판자 한 개이거나, 길이의 합이 그 변과 같은 판자 두 개로 이루어진다.

그런데 문제가 하나 더 있다. 목수 반장은 모든 목재를 매우 아끼기 때문에 어떤 판자도 톱으로 자르지 않으려 한다. 그래서 목수 반장은 기증된 판자로 위의 조건을 지키면서 바닥 전체를 덮을 수 있는지 알고 싶어 한다. 덮을 수 있다면 필요한 판자의 최소 개수도 알고 싶어 한다.

아래 그림은 폭이 100 cm이고 길이가 1, 2, 2, 2, 2, 3, 3, 4, 4, 5미터인 판자 10개로 4 × 5미터 홀 바닥을 덮는 두 가지 방법을 보여 준다.

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스의 첫째 줄에는 홀의 크기를 미터 단위로 나타내는 두 정수 MM과 NN이 주어진다 (1≤N,M≤1041 \le N, M \le 10^4). 둘째 줄에는 판자의 폭을 센티미터 단위로 나타내는 정수 LL이 주어진다 (1≤L≤1001 \le L \le 100). 셋째 줄에는 기증된 판자의 개수를 나타내는 정수 KK가 주어진다 (1≤K≤1051 \le K \le 10^5). 넷째 줄에는 판자 하나하나의 길이를 미터 단위로 나타내는 정수 XiX_i KK개가 공백 하나로 구분되어 주어진다 (1≤i≤K1 \le i \le K일 때 1≤Xi≤1041 \le X_i \le 10^4).

입력의 끝은 0 두 개가 공백 하나로 구분되어 있는 줄로 나타낸다.

출력

각 테스트 케이스마다 조건을 지키면서 홀 바닥 전체를 덮는 데 필요한 판자의 최소 개수를 한 줄에 출력한다. 조건을 지키면서 바닥 전체를 덮을 수 없으면 impossivel(모두 소문자, 악센트 없음)을 한 줄에 출력한다.

예제1

  1. 예제 1

    입력
    4 5
    100
    10
    1 2 2 2 2 3 3 4 4 5
    5 4
    100
    7
    4 5 4 4 4 4 3
    4 5
    99
    4
    4 4 4 4
    3 2
    100
    7
    2 4 1 4 2 4 4
    0 0
    
    예상 출력
    7
    5
    impossivel
    impossivel