Problem:
Score : 300 points

Problem Statement

There are N candles placed on a number line.
The i-th candle from the left is placed on coordinate x_i.
Here, x_1 < x_2 < ... < x_N holds.

Initially, no candles are burning.
Snuke decides to light K of the N candles.

Now, he is at coordinate 0.
He can move left and right along the line with speed 1.
He can also light a candle when he is at the same position as the candle, in negligible time.

Find the minimum time required to light K candles.

Constraints

1 \leq N \leq 10^5

1 \leq K \leq N

x_i is an integer.

|x_i| \leq 10^8

x_1 < x_2 < ... < x_N

Input

Input is given from Standard Input in the following format:

N K
x_1 x_2 ... x_N

Output

Print the minimum time required to light K candles.

Sample Input 1

5 3
-30 -10 10 20 50

Sample Output 1

40

He should move and light candles as follows:

Move from coordinate 0 to -10.

Light the second candle from the left.

Move from coordinate -10 to 10.

Light the third candle from the left.

Move from coordinate 10 to 20.

Light the fourth candle from the left.

Sample Input 2

3 2
10 20 30

Sample Output 2

20

Sample Input 3

1 1
0

Sample Output 3

0

There may be a candle placed at coordinate 0.

Sample Input 4

8 5
-9 -7 -4 -3 1 2 3 4

Sample Output 4

10

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Time Limit Exceeded)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {
	
	static int N,K;
	static int Answer=Integer.MAX_VALUE;
	static int temp;
	static ArrayList<Integer> leftArr = new ArrayList<Integer>();
	static ArrayList<Integer> rightArr = new ArrayList<Integer>();
	static boolean contains0 = false;
	//static TreeSet<Integer> ts = new TreeSet<Integer>();
	public static void main(String[] args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String lineA = br.readLine();
		N = Integer.valueOf(lineA.split(" ")[0]);
		K = Integer.valueOf(lineA.split(" ")[1]);
		String lineB = br.readLine();
		String[] bStrArr = lineB.split(" ");
		
		if(Integer.valueOf(bStrArr[0]) >=0){
			Answer = Integer.valueOf(bStrArr[K-1]);
		}else if(Integer.valueOf(bStrArr[N-1]) <=0){
			Answer = Math.abs(Integer.valueOf(bStrArr[N-K]));
		}else{
			for(int i=0;i<N;i++){
				temp =  Integer.valueOf(bStrArr[i]);
				if(temp < 0){
					leftArr.add(temp);
				}else{
					if(temp==0){
						contains0=true;
					}else{
						rightArr.add(temp);
					}
				}
			}
			int index=0;
			if(contains0 ){
				if(K==1){
					Answer = 0;
				}else{
					K=K-1;
				}
				
			}
			getTime(index,leftArr.size(),-1,0,0);
			//Answer = ts.first();
			
		}
		System.out.println(Answer);
	}
	// flag 0开始，1 右，-1左
	private static void getTime(int index, int leftIndex, int rightIndex,int ans,int flag) {
		//System.out.println("index="+index+",leftIndex="+leftIndex+",rightIndex="+rightIndex+",ans="+ans+",flag="+flag);
		if(index == K){
			if(ans<Answer) {
				Answer = ans;
			}
			return;
		}else{
			if(flag == 0){
				if(leftIndex-1>=0){
					getTime(index+1, leftIndex-1, rightIndex,ans-leftArr.get(leftIndex-1),-1);
				}
				if( rightIndex+1 <rightArr.size()){
					getTime(index+1, leftIndex, rightIndex+1,ans+rightArr.get(rightIndex+1),1);
				}
			}else if(flag == 1){
				if(leftIndex-1>=0){
					getTime(index+1, leftIndex-1, rightIndex,ans-leftArr.get(leftIndex-1)+rightArr.get(rightIndex),-1);
				}
				if( rightIndex+1 <rightArr.size()){
					getTime(index+1, leftIndex, rightIndex+1,ans+rightArr.get(rightIndex+1)-rightArr.get(rightIndex),1);
				}
			}else if(flag == -1){
				if(leftIndex-1>=0){
					getTime(index+1, leftIndex-1, rightIndex,ans-(leftArr.get(leftIndex-1)-leftArr.get(leftIndex)),-1);
				}
				if( rightIndex+1 <rightArr.size()){
					getTime(index+1, leftIndex, rightIndex+1,ans+rightArr.get(rightIndex+1)-leftArr.get(leftIndex),1);
				}
			}
		}
	}
}