세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책들의 원래 위치가 주어질 때, 책을 모두 제자리에 놔둘 때 드는 최소 걸음 수를 계산하는 프로그램을 작성하시오. 세준이는 한 걸음에 좌표 1칸씩 가며, 책의 원래 위치는 정수 좌표이다. 책을 모두 제자리에 놔둔 후에는 다시 0으로 돌아올 필요는 없다. 그리고 세준이는 한 번에 최대 M권의 책을 들 수 있다.
첫째 줄에 책의 개수 N과, 세준이가 한 번에 들 수 있는 책의 개수 M이 주어진다. 둘째 줄에는 책의 위치가 주어진다. N은 10,000보다 작거나 같은 자연수이고, M은 10,000보다 작거나 같다. 책의 위치는 0이 아니며, 그 절댓값이 10,000보다 작거나 같다.
첫째 줄에 정답을 출력한다.
7 2
-37 2 -6 -39 -29 11 -28
131
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
ArrayList<Integer> minus = new ArrayList<>();
ArrayList<Integer> plus = new ArrayList<>();
int N = Integer.parseInt(input[0]);
int M = Integer.parseInt(input[1]);
String[] books = br.readLine().split(" ");
long sum = 0;
int maxFlag = 0;
for(int i=0; i<N; i++) {
int book = Integer.parseInt(books[i]);
if(book<0) {
minus.add(Math.abs(book));
}
else
plus.add(book);
}
Collections.sort(minus, Collections.reverseOrder());
Collections.sort(plus, Collections.reverseOrder());
if(!minus.isEmpty() && !plus.isEmpty()) {
if(minus.get(0)>plus.get(0))
maxFlag--;
else
maxFlag++;
}
else {
if(minus.isEmpty())
maxFlag++;
else
maxFlag--;
}
ArrayList<Integer> tmp = maxFlag<0 ? minus : plus;
sum += tmp.remove(0);
int i=0;
while(!tmp.isEmpty()) {
if(i==M-1)
break;
tmp.remove(0);
i++;
}
for(int j=0; j<2; j++) {
if (j==0)
tmp = minus;
else
tmp = plus;
int idx = 0;
while (!tmp.isEmpty()) {
if (idx==0)
sum += tmp.remove(0)*2;
else
tmp.remove(0);
idx++;
idx%=M;
}
}
System.out.println(sum);
}
}