만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

눈 벽

시간 제한1초메모리 제한1024 MB

요약
주어진 너비의 블록을 쌓아 너비 W의 벽을 최대한 높게 만듭니다. 연속한 두 행에서 같은 위치에 틈이 생기지 않아야 합니다.
난이도

어려움10점 중 9점

유형
구현, 그리디, 조합론
정답자
아직 제출이 없습니다

문제

눈싸움에서 굴욕을 당한 스웨덴은 눈 벽을 쌓고 그 비용을 핀란드에게 치르게 하려 한다. 벽의 너비는 WW이고, 가능한 한 높아야 한다 (엄청나게 높을 거다!).

각 블록의 높이는 1이지만 너비는 블록마다 다를 수 있다. 벽을 쌓을 때 모든 블록은 다음 규칙을 만족해야 한다. 블록 바로 아래 줄에서, 블록의 두 끝점이 놓인 각 위치마다 그 점의 바로 오른쪽과 바로 왼쪽에 블록이 하나씩 있어야 한다. 다만 줄의 시작과 끝에서는 이 규칙이 적용되지 않는다. 대신 모든 줄의 그 자리에 끝점이 있어야 한다.

벽에서 바로 이어지는 두 줄의 같은 위치에 구멍이 있어서는 안 된다. 벽 바로 위의 빈 줄은 계산에 넣지 않는다.

그림 1: 허용되지 않는 벽(왼쪽)과 허용되는 벽(오른쪽)의 예.

입력

첫 줄에 테스트 케이스 번호 TT, 블록 수 NN, 벽의 너비 WW가 정수로 주어진다. 다음 줄에는 각 블록의 너비가 NN개의 정수로 주어진다.

모든 테스트 케이스는 20887.zip 파일로 받을 수 있다.

출력

첫 줄에 벽의 높이 HH를 출력한다.

이어서 벽의 각 줄마다 한 줄씩, 총 HH줄을 출력한다. ii번째 줄에는 먼저 그 줄의 블록 수 BB를 쓰고, 이어서 jj번째 블록의 위치 Pi,jP_{i,j}와 길이 Li,jL_{i,j}를 쌍으로 BB개 쓴다.

힌트

테스트 케이스 번호 TT를 입력받아 그 테스트 케이스의 풀이를 출력하는 프로그램만 제출하면 된다.

직접 프로그램을 작성하기 싫다면 http://progolymp.se/uploads/snokaosgen.html을 쓸 수 있다. 그곳에 모든 풀이를 붙여 넣으면 제출할 수 있는 Python 3 프로그램을 받는다.

예제1

  1. 예제 1

    입력
    1 1 1
    1
    
    예상 출력
    1
    1 0 1