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 Java7 (OpenJDK 1.7.0) (judge verdict: Wrong Answer)

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 if(N == K){
			int left = Math.abs(Integer.valueOf(bStrArr[0]));
			int right = Math.abs(Integer.valueOf(bStrArr[N-1]));
			if(left < right) {
				Answer = left*2+right;
			}else {
				Answer = left+right*2;
			}
		}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,0);
		}
		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{
			int dRight = 0;
			int dLeft = 0;
			if(flag == 0) {
				dRight = rightArr.get(rightIndex);
				dLeft = Math.abs(leftArr.get(leftIndex));
				if(dLeft>=dRight) {
					getTime(index+1, leftIndex, rightIndex+1,ans+dRight,1);
				}else {
					getTime(index+1, leftIndex-1, rightIndex,ans+dLeft,-1);
				}
			}else if(flag == 1) {//右
				if(rightIndex <rightArr.size()) {
					dRight = rightArr.get(rightIndex);
					if(leftIndex < 0 ) {
						dLeft = Integer.MAX_VALUE;
					}else {
						dLeft = Math.abs(leftArr.get(leftIndex));
					}
					if(dLeft>=dRight) {
						if(rightIndex == 0) {
							getTime(index+1, leftIndex, rightIndex+1,ans+dRight,1);
						}else {
							getTime(index+1, leftIndex, rightIndex+1,ans+dRight-rightArr.get(rightIndex-1),1);
						}
					}else {
						if(leftIndex == leftArr.size()-1) {
							getTime(index, leftIndex, rightIndex,ans+rightArr.get(rightIndex-1),-1);
						}else {
							getTime(index, leftIndex, rightIndex,ans+rightArr.get(rightIndex-1)-Math.abs(leftArr.get(leftIndex+1)),-1);
						}
						
					}
				}else {
					if(leftIndex == leftArr.size()-1) {
						getTime(index, leftIndex, rightIndex,ans+rightArr.get(rightIndex-1),-1);
					}else {
						getTime(index, leftIndex, rightIndex,ans+rightArr.get(rightIndex-1)-Math.abs(leftArr.get(leftIndex+1)),-1);
					}
				}
			}else {//左
				if(leftIndex >= 0) {
					if(rightIndex >= rightArr.size()) {
						dRight = Integer.MAX_VALUE;
					}else {
						dRight = rightArr.get(rightIndex);
					}
					dLeft = Math.abs(leftArr.get(leftIndex));
					if(dLeft<=dRight) {
						if(leftIndex==leftArr.size()-1) {
							getTime(index+1, leftIndex-1, rightIndex,ans+dLeft,-1);
						}else {
							getTime(index+1, leftIndex-1, rightIndex,ans+dLeft-Math.abs(leftArr.get(leftIndex+1)),-1);
						}
					}else {
						if(rightIndex == 0) {
							getTime(index, leftIndex, rightIndex,ans+Math.abs(leftArr.get(leftIndex+1)),1);
						}else {
							getTime(index, leftIndex, rightIndex,ans+Math.abs(leftArr.get(leftIndex+1))-rightArr.get(rightIndex-1),1);
						}
						
					}
				}else {
					if(rightIndex == 0) {
						getTime(index, leftIndex, rightIndex,ans+Math.abs(leftArr.get(leftIndex+1)),1);
					}else {
						getTime(index, leftIndex, rightIndex,ans+Math.abs(leftArr.get(leftIndex+1))-rightArr.get(rightIndex-1),1);
					}
				}
			}
		}
		
	}
}