Problem:
Max Score: 350 Points

Problem Statement

There are N buildings along the line. The i-th building from the left is colored in color i, and its height is currently a_i meters.

Chokudai is a mayor of the city, and he loves colorful thigs. And now he wants to see at least K buildings from the left.

You can increase height of buildings, but it costs 1 yens to increase 1 meters. It means you cannot make building that height is not integer.

You cannot decrease height of buildings.

Calculate the minimum cost of satisfying Chokudai's objective.

Note: "Building i can see from the left" means there are no j exists that (height of building j) ≥ (height of building i) and j < i.

Input Format

N K
a_1 a_2 a_3 ... a_N

Output Format

Print the minimum cost in one line. In the end put a line break.

Constraints

1 ≤ K ≤ N ≤ 15

1 ≤ a_i ≤ 10^9

Scoring

Subtask 1 [120 points]

N = K

Subtask 2 [90 points]

N ≤ 5

a_i ≤ 7

Subtask 3 [140 points]

There are no additional constraints.

Sample Input 1

5 5
3949 3774 3598 3469 3424

Sample Output 1

1541

The optimal solution is (height of buildings from the left) = [3949, 3950, 3951, 3952, 3953].

Sample Input 2

5 3
7 4 2 6 4

Sample Output 2

7

The optimal solution is (height of buildings from the left) = [7, 8, 2, 9, 4].

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <algorithm>
#include<iostream>
#include<vector>
#include<list>
#include<map>
#include<set>
#include<string>
#include <sstream>

#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<limits.h>
using lll = long long;
using ull = unsigned long long;
using namespace std;

vector<vector<int>> combi(int n,int r){
  vector<vector<int>> ret;
  vector<int> tmp;
  int ii,jj;
  int cnt;

  for(ii=0;ii<pow(2,n);ii++){

    cnt = 0;
    tmp.clear();
    for(jj=0;jj<n;jj++){

      if( ((ii >> jj) & 1) == 1){
        cnt++;
        tmp.push_back(jj);
      }
      else{

      }
    }
    if(cnt == r){
      ret.push_back(tmp);
    }
  }
  return ret;
  
}
bool check(vector<lll>* c,int k){
  lll ii,prev;
  lll cnt = 0;

  for(ii=0;ii<c->size();ii++){
    if(ii==0){
      prev = c->at(0);
      cnt++;
    }
    else{
      if(c->at(ii) > prev){
        prev = c->at(ii);
        cnt++;
      }
      
    }
  }

  if(cnt>=k){
    return true;
  }
  else{
    return false;
  }

}

int main(){
  lll ii,jj,kk;
  vector<int> ret;
  int n,k;
  vector<lll> a;
  vector<lll> aft;
  cin >> n >> k;
  a.resize(n);

  for(ii=0;ii<n;ii++){
    cin >> a[ii];
  }

  vector<vector<int>> target;
  target = combi(n,k);
  lll min = LONG_LONG_MAX;
  lll sum;
  lll prev;
  lll up;
  up = 0;

  for(vector<int> t : target){
    sum = 0;
    up = 0;
    aft = a;
    for(ii=0;ii<t.size();ii++){
      
      if(ii != 0){

        if(a[t[ii]] <= prev){

          up = prev - a[t[ii]] +1;
          sum += prev - a[t[ii]] +1;
          
          //a[t[ii]] += prev - a[t[ii]] +1;
          

        }
        else{
          up = 0;
        }
      }

      prev = a[t[ii]] + up;
      aft[t[ii]] = prev;

      //cout << "a[" << t[ii] << "]" << a[t[ii]] << "prev" << prev <<  "up:" << up << endl;
    }
    //cout << "sum:" << sum << endl;
    
    if(sum < min && check(&aft,k)){
      min = sum;
    }
    //for(auto val : aft){
    //  cout << val << "\t" ;
    //}
    //cout << endl;
  }

  cout << min << endl;
  
  return 0;
  
}