You are on page 1of 2

import java.util.

*;
import java.util.regex.*;
import java.text.*;
import java.math.*;
import java.awt.geom.*;
import java.io.*;
import java.util.Arrays;
public class Contiguous{
static int[] bases;
static int basec;
static int m,k;
static int[] reqs;
static boolean[][] used;
static long[][] mem;
public static void main(String args[])throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
int a=Integer.parseInt(br.readLine());
int b1=Integer.parseInt(br.readLine());
int
c[]=Arrays.stream(br.readLine().split(",")).mapToInt(Integer::parseInt).toArray();
bw.write(mincal(a,b1,c)+"\n");
br.close();
bw.close();
}

static long doit(int s,int b){


if (s==m)return 0;
if (used[s][b]) return mem[s][b];
long res=1000000000000000L;
int base=bases[b];
int addr=reqs[s];
if(addr>=base && addr<base + k)
{
res=doit(s+1,b);
}
else
{
for(int i=0;i<basec;i++)
{
int base2=bases[i];
if(addr<base2||addr>=base2+k) continue;
int p=Math.min(k,Math.abs(base2-base));
res=Math.min(res,p + doit(s+1,i));
}
}
used[s][b]=true;
mem[s][b]=res;
return res;
}
public static long mincal(int n,int k,int[] addresses){
Contiguous obj=new Contiguous();
obj.k=k;
reqs=addresses;
m=addresses.length;
bases=new int[m+m+2];
bases[basec++]=0;
bases[basec++]=n-k;
for(int i:addresses){
if(i<n-k)bases[basec++]=i;
if(i-k+1>0)bases[basec++]=i-k+1;
}
used=new boolean[m][basec];
mem=new long[m][basec];
long res=1000000000000000L;
for(int i=0;i<basec;i++){
res=Math.min(res,doit(0,i));
}
return k+res;
}
}

You might also like