Algorithm/Algorithm Problem
백준 1461 도서관(구현, 그리디)
땅지원
2022. 6. 3. 20:04
https://www.acmicpc.net/problem/1461
1461번: 도서관
세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책
www.acmicpc.net
규칙을 찾는게 중요한 문제였다. 시작점 0에서 음수, 양수 편을 나누고 m만큼 left[m * i] , right[m * i] 간다음에
제일 큰 수에서는 0으로 다시 돌아오지 않고 그 자리에서 끝나면 된다.
유의할점은 left, right의 길이가 m으로 나누어 떨어지지 않을 경우 나머지 k만큼 먼저 간다음에 k에서 시작하여
m*i 만큼 계속 더해주는게 핵심이였다.
n,m = list(map(int,input().split()))
data = list(map(int,input().split()))
data.sort()
left = []
right = []
max_value = 0
for i in data:
if i < 0:
left.append(-i)
max_value = max(max_value,-i)
else:
right.append(i)
max_value = max(max_value,i)
res = 0
left = left[::-1]
left_value = len(left) // m
left_remainer = len(left) % m
right_value = len(right) // m
right_remainer = len(right) % m
if left_remainer > 0:
idx = left_remainer-1
for i in range(idx,len(left),m):
res += left[i] * 2
else:
for i in range(m-1,len(left),m):
res += left[i] * 2
if right_remainer > 0:
idx = right_remainer-1
for i in range(idx,len(right),m):
res += right[i] * 2
else:
for i in range(m-1,len(right),m):
res += right[i] * 2
print(res - max_value)