https://www.acmicpc.net/problem/1680
1680번: 쓰레기 수거
쓰레기장에서 출발한 쓰레기차가 여러 지점들을 방문하며 쓰레기를 모으고 있다. 쓰레기차는 쓰레기장에서 가까운 지점부터 방문하며, 쓰레기를 모으다가 다음과 같은 경우에 쓰레기장으로 돌
www.acmicpc.net
[풀이 방법]
쓰레기 차는 다음 3가지 경우일 때, 쓰레기장으로 돌아가 싣고 있는 쓰레기를 비운다.
1. 쓰레기의 양이 용량에 도달했을 때.
2. 그 지점의 쓰레기를 실었을 때 쓰레기차의 용량을 넘게 될 때.
3. 더 이상 쓰레기를 실을 지점이 없을 때.
주어진 거리는 지점과 쓰레기장의 거리고, 일직선상에 모든 지점이 있으므로
이전 지점의 거리를 기억해서 현재 지점의 거리와 뺀 것으로 이동 거리를 계산했다.
예를 들어, 거리는 1 지점 ~ 쓰레기 장 : 1, 2 지점 ~ 쓰레기 장 : 2 이면 1지점~2지점:1 이다.
지점에 들려서 쓰레기를 채울 때, 3가지 경우가 있다.
1. 쓰레기차에 해당 지점의 쓰레기를 채워도 용량보다 적을 경우
이 경우는, 해당 지점 - 이전 지점의 거리를 더하면 된다.
2. 채웠을 때 허용 용량과 같을 경우
이 경우는, 쓰레기 장으로 돌아가야하므로 해당 지점 - 이전 지점 거리를 더하고,
해당 지점과 쓰레기 장 사이의 거리의 2배를 더한다. (왔다갔다하므로)
이 때, 만약 해당 지점이 마지막이면 왔다갔다 하지 않고, 쓰레기 장만 가면 되므로
일단은 해당 지점 - 이전 지점 거리를 더한다.
3. 채웠을 때 허용 용량보다 클 경우
이 경우는, 쓰레기 장으로 돌아가서 버리고 다시 해당 지점으로 돌아와서 쓰레기를 채운다.
즉, 거리는 해당 지점 - 이전 지점 거리를 더하고, 해당 지점과 쓰레기 장 사이의 거리의 2배를 더한다.
이 때는 마지막이어도, 다시 와야하므로 다른 조건문을 달지 않는다.
이제 모든 쓰레기를 수거했다면, 그 지점에서부터 다시 쓰레기장으로 간다.
#Test 개수
for _ in range(int(input())):
w,n = map(int,input().split())
T = []
for __ in range(n):
x,wi = map(int,input().split())
T.append((x,wi))
car = 0
dis = 0
previous = 0
for i in T:
#i[0]:거리,i[1]:양
if car + i[1]<w:
dis+=i[0]-previous
car +=i[1]
elif car + i[1] == w:
dis += (i[0]-previous)+ i[0]*2
car = 0
if T.index(i)==n-1:
dis -= i[0]*2
elif car + i[1] > w:
car = i[1]
dis += (i[0] - previous) + i[0] * 2
previous = i[0]
#모든 쓰레기 수거
if T.index(i)==n-1:
dis += i[0]
print(dis)
'알고리즘 공부 > 구현' 카테고리의 다른 글
[백준/구현] 10797번: 10부제 (0) | 2022.10.02 |
---|---|
[백준/구현] 1292번 쉽게 푸는 문제 (0) | 2022.09.04 |
[백준/새싹 문제] 🌱🌱 (0) | 2022.08.07 |
[백준/구현] 1730번 판화 (0) | 2022.04.13 |
[백준/문자열] 4396 지뢰 찾기 (0) | 2022.04.04 |