증가하는 하위 시퀀스로 분할


16

사양

이 과제는 간단하게 설명합니다. 입력은 음이 아닌 정수로 구성된 비어 있지 않은 배열이며 가능한 한 적은 수의 증가하는 하위 시퀀스로 입력하는 것입니다. 더 공식적으로 입력 배열이 A인 경우 출력은 다음 B과 같은 배열의 배열 입니다.

  • 각 배열은 분리되지 않은 (반드시 연속적인) 하위 시퀀스로 B분할 A됩니다. 귀납적으로 이것은을 B포함하는 싱글 톤 배열 A이거나의 첫 번째 요소 B가 하위 시퀀스 A이고 나머지 A는 해당 하위 시퀀스가 ​​제거 된 파티션을 의미합니다.
  • 모든 배열 B이 증가하고 있는 것은 아닙니다.
  • 배열 수 B는 최소입니다.

입력 및 출력 모두 언어의 기본 배열 형식으로 가져올 수 있습니다. 몇 가지 올바른 출력이있을 수 있습니다.

입력 배열을 고려하십시오 A = [1,2,1,2,5,4,7,1]. 가능한 출력은 B = [[1],[1,2,4,7],[1,2,5]]입니다. 파티션 조건은이 다이어그램에서 분명합니다.

A    1 2 1 2 5 4 7 1
B[0]               1
B[1] 1 2       4 7
B[2]     1 2 5

또한 각 배열 B이 증가하고 있습니다. 마지막으로 A증가하는 두 개의 하위 시퀀스로 나눌 수 없으므로 길이 B도 최소화됩니다. 따라서 올바른 출력입니다.

규칙과 득점

함수 또는 전체 프로그램을 작성할 수 있습니다. 가장 낮은 바이트 수가 이기고 표준 허점이 허용되지 않습니다. 시간 제한은 없지만 제출하기 전에 모든 테스트 사례에서 솔루션을 평가해야합니다.

테스트 사례

하나의 가능한 출력 만 표시되지만 몇 가지 유효한 옵션이있을 수 있습니다. 특히 결과의 배열 순서는 중요하지 않지만 각 개별 배열의 순서는 증가해야합니다.

[0] -> [[0]]
[3,5,8] -> [[3,5,8]]
[2,2,2,2] -> [[2,2,2,2]]
[1154,1012,976,845] -> [[845],[976],[1012],[1154]]
[6,32,1,2,34,8] -> [[1,2,8],[6,32,34]]
[1,12,1,12,1,13] -> [[1,1,1,13],[12,12]]
[6,4,6,13,18,0,3] -> [[0,3],[4,6,13,18],[6]]
[1,2,3,2,3,4,7,1] -> [[1,1],[2,2,3,4,7],[3]]
[0,9,2,7,4,5,6,3,8] -> [[0,2,3,8],[4,5,6],[7],[9]]
[7,1,17,15,17,2,15,1,6] -> [[1,1,6],[2,15],[7,15,17],[17]]
[4,12,2,10,15,2,2,19,16,12] -> [[2,2,2,12],[4,10,15,16],[12,19]]
[10,13,9,2,11,1,10,17,19,1] -> [[1,1],[2,10,17,19],[9,11],[10,13]]
[3,7,3,8,14,16,19,15,16,2] -> [[2],[3,3,8,14,15,16],[7,16,19]]
[15,5,13,13,15,9,4,2,2,17] -> [[2,2,17],[4],[5,9],[13,13,15],[15]]

3
이 규칙은 같은 솔루션을 허용하는 것으로 보입니다 [0,5,2,0] -> [[0,5],[0,2]](즉, 각각을 한 번 사용하는 대신 첫 번째 0을 재활용). 의도적인가요?
feersum

@feersum 의도적이지 않고 잘 잡히지 않았습니다. 에 대한 조건을 다시 작성 B했으므로 이제 더 명확 해졌습니다.
Zgarb

답변:


3

하스켈, 54 바이트

n#[]=[[n]]
n#(l:c)|[n]<=l=(n:l):c|1<2=l:n#c
foldr(#)[]

사용 예 : foldr(#)[] [4,12,2,10,15,2,2,19,16,12]->[[2,2,2,12],[4,10,15,16],[12,19]]

작동 방식 : 오른쪽 끝에서 입력 목록을 살펴 봅니다. 현재 요소를 앞에 붙이는 (목록) 출력 목록 작성 n첫번째 서브리스트에 l어디 n작거나 머리 같다 l. 없는 경우 n출력 목록 끝에 새 싱글 톤 목록을 만드십시오 .


1

Pyth, 20 바이트

fTu&ahfSI+THGHGQm[)Q

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

욕심 접근. len(input)빈 목록을 만듭니다 . 그런 다음 input첫 번째 목록 선택 에서 각 숫자를 반복하고 숫자를 추가 한 후에도 여전히 정렬됩니다.

설명:

fTu&ahfSI+THGHGQm[)Q   implicit: Q = input list
                m[)Q   create a list of empty lists and assign to G
  u            Q       iterate over all numbers H in input:
      f     G             filter for lists T in G, which satisfy:
         +TH                 create a new list out of T and H
       SI                    and check if it is sorted
     h                    take the first such list T
    a        H            and append H
   &          G           logical and with G (so that u doesn't overwrite G)
fT                     remove all empty lists

@ThomasKwa 지금 많은 추가 테스트 사례를 테스트했습니다. 잘못된 결과를 제공하는 하나를 찾을 수 없습니다. Greedy는 항상 올바른 결과를 반환한다고 확신합니다.
Jakube

@ThomasKwa 아, 그 반대의 예는 다른 탐욕스러운 전략이었습니다 (가장 긴 하위 시퀀스를 찾아서 제거하고 재귀하십시오). 또한이 제출이 실패한 테스트 사례를 찾지 못하는 것 같습니다.
Zgarb

글쎄, 나는 그것이 작동한다는 것을 입증하는 책임에 대한 부담이 있다고 생각한다. 이것이 유효한 것으로 판명되면 나는 투표 할 것이다.
lirtosiast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.