나이츠브리지의 크레인
시간 제한4초메모리 제한512 MB
각 건물의 꼭대기에서 최종 양중 능력이 목표 이상이 되도록 크레인을 배치하되, 출력을 사전순으로 가장 작게 만드는 계획을 구한다.
문제
나이츠브리지의 고층 건물은 크레인으로 짓는다. 크레인을 땅에 세우려면 건물만큼 높은 크레인이 필요하니, 현장에서는 더 작은 크레인을 탑 위에 올려서 쓴다. 그러면 다음 문제가 생긴다. 그 크레인을 어떻게 꼭대기까지 올리는가. 답은 더 작은 크레인으로 들어 올리는 것이다. 그 작은 크레인마저 무거우면 더 작은 크레인이 그것을 들어 올린다. 이렇게 내려가면 기술자가 주머니에 넣어 들고 올라갈 만큼 가벼운 크레인에 닿는다.
크레인은 대가 있다. 번 크레인의 무게는 킬로그램이고, 들어 올릴 수 있는 최대 무게는 킬로그램이다. 공사 중인 건물은 개이고, 번 건물은 마지막에 꼭대기에 선 크레인이 킬로그램을 들어 올리면 요구를 만족한다.
건물 하나에 적용되는 규칙은 다음과 같다.
- 꼭대기에서 쓸 수 있는 인양 능력은 크레인이 하나도 없을 때 이고, 크레인을 올린 뒤에는 맨 위에 선 크레인의 최대 인양 무게와 같다.
- 무게가 인 크레인은 그 건물의 인양 능력이 이상일 때만 올릴 수 있다. 무게가 인 크레인은 주머니에 들어가므로 기술자가 들고 올라가고, 언제나 첫 크레인이 될 수 있다.
- 올린 크레인이 새로 맨 위에 서므로 인양 능력은 그 크레인의 값으로 바뀐다.
- 지금의 인양 능력을 키우지 못하는 크레인은 올리지 않는다. 그래서 한 건물에 올라간 크레인의 인양 능력은 아래에서 위로 갈수록 커진다.
- 한 번 올린 크레인은 다시 옮기지 못한다. 크레인 한 대는 많아야 건물 하나에 쓰고, 쓰지 않고 남는 크레인이 있어도 된다.
모든 건물의 요구를 만족하는 계획을 구하라.
입력
- 첫째 줄에 크레인의 대수 이 주어진다. ()
- 다음 개 줄에 번 크레인의 무게 와 최대 인양 무게 가 공백을 사이에 두고 주어진다. 단위는 킬로그램이다. ()
- 다음 줄에 건물의 개수 이 주어진다. ()
- 마지막 줄에 개의 정수 이 공백을 사이에 두고 주어진다. ()
출력
모든 건물의 요구를 만족시킬 수 없으면 impossible을 출력한다.
만족시킬 수 있으면 개의 줄을 출력한다. 번째 줄에는 번 건물에 올리는 크레인의 번호를 올리는 순서대로 공백을 사이에 두고 출력한다.
요구를 만족하는 계획은 여러 개일 수 있다. 그중 다음 기준으로 가장 작은 계획을 출력한다. 먼저 두 계획의 첫째 줄을 정수의 나열로 비교한다. 처음으로 서로 다른 자리에서 수가 작은 쪽이 작고, 그 자리까지 수가 모두 같은데 한쪽이 먼저 끝나면 짧은 쪽이 작다. 첫째 줄이 같으면 둘째 줄을 같은 방법으로 비교하고, 그다음 줄도 같은 방법으로 계속 비교한다.