아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

최적의 토너먼트

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

요약
주어진 실력을 가진 N명의 참가자를 높이가 K 이하인 토너먼트 대진표의 리프에 배치해 모든 경기의 실력 차 합을 최소로 만든다.
난이도

어려움10점 중 8점

유형
동적 계획법, 정렬, 트리, 그리디
정답자
아직 제출이 없습니다

문제

매년 열리는 프로그래밍 대회의 대진표를 짜려고 한다. 올해 대회에는 참가자 NN명이 나오고, 대회는 토너먼트 방식으로 치른다.

토너먼트는 잎 노드가 NN개인 이진 트리로 나타내고, 참가자를 잎 노드에 한 명씩 배정한다. 한 경기에서는 두 참가자가 맞붙어서 이긴 쪽이 다음 라운드로 올라가고 진 쪽은 탈락한다. 끝까지 살아남은 한 명이 우승자이고, 결승전은 트리의 루트 노드에 대응한다.

참가자 ii의 실력은 정수 AiA_i이다. 두 참가자가 맞붙으면 실력이 더 큰 쪽이 항상 이긴다. 실력이 같으면 승자는 무작위로 정해진다.

지난 대회에서는 한쪽으로 크게 기운 경기가 너무 많아 지루하다는 불만이 있었다. 그래서 경기의 지루함과 토너먼트의 지루함을 다음과 같이 정한다. 실력이 AiA_i인 참가자와 실력이 AjA_j인 참가자가 맞붙는 경기의 지루함은 두 실력의 차이 ∣Ai−Aj∣|A_i - A_j|이다. 토너먼트의 지루함은 트리에 있는 모든 경기의 지루함을 더한 값이다.

토너먼트의 높이가 KK 이하이기만 하면 균형이 맞지 않는 모양을 포함해 어떤 모양이든 쓸 수 있다. 토너먼트의 높이는 루트 노드에서 잎 노드까지 이어지는 단순 경로에 놓인 경기 수의 최댓값이다.

지루함의 최솟값을 구하는 프로그램을 작성하라.

그림 1. 첫 번째 예제에서 만들 수 있는 토너먼트 두 가지. 왼쪽은 높이가 2이고 오른쪽은 높이가 3이다.

입력

입력은 테스트 케이스 하나로 이루어지고, 형식은 다음과 같다.

N K
A_1 A_2 ... A_N

첫째 줄에 정수 NN과 KK가 주어진다. (2≤N≤10002 \le N \le 1000, 1≤K≤501 \le K \le 50) N≤2KN \le 2^K가 보장된다.

둘째 줄에 참가자의 실력 A1,A2,…,ANA_1, A_2, \dots, A_N이 주어진다. (1≤Ai≤1000001 \le A_i \le 100000)

출력

높이가 KK 이하인 토너먼트 중에서 지루함이 가장 작은 값을 출력한다.

예제3

  1. 예제 1

    입력
    4 3
    1 3 4 7
    
    예상 출력
    6
    
  2. 예제 2

    입력
    5 3
    1 3 4 7 9
    
    예상 출력
    10
    
  3. 예제 3

    입력
    18 7
    67 64 52 18 39 92 84 66 19 64 1 66 35 34 45 2 79 34
    
    예상 출력
    114