Input
표준 입력으로 다음 정보가 주어진다.
첫 번째 줄에는 도시의 개수를 나타내는 정수 N(2 ≤ N ≤ 100,000)이 주어진다.
다음 줄에는 인접한 두 도시를 연결하는 도로의 길이가 제일 왼쪽 도로부터 N-1개의 자연수로 주어진다.
다음 줄에는 주유소의 리터당 가격이 제일 왼쪽 도시부터 순서대로 N개의 자연수로 주어진다.
제일 왼쪽 도시부터 제일 오른쪽 도시까지의 거리는 1이상 1,000,000,000 이하의 자연수이다. 리터당 가격은 1 이상 1,000,000,000 이하의 자연수이다.
1 | import sys |
Greedy
그리디는 일단 현재 상황에서 할 수 있는 최선의 선택을 하고보는 타입이다. 이 문제가 대표적인 예시 같은데,
현재 위치 기준 바로 다음 주유소의 가격이 싸면 일단 간다.
1
2
3if p[now] > p[now+1]:
ret += p[now] * km[now]
now += 1비싸면 지금보다는 싼 주유소를 찾을 때까지 계속 찾고, 싼 곳을 찾으면 거기로 이동한다.
1
2
3
4
5
6
7
8
9else:
dist = 0
next = 0
for next in range(now + 1, n):
dist += km[next-1]
if p[now] > p[next]:
break
ret += dist * p[now]
now = next이 모든 건 도착지 전까지만 해당, 도착지에 도달할 경우 종료해야 한다.
1
while now < n-1:
완전 탐색처럼 가장 싼 곳을 찾아서 움직이면 안 된다. 중간중간에 절약할 수 있는 경우에는 일단 절약하고 봐야 함.