10713 기차 여행

정민용·2023년 5월 7일

백준

목록 보기
190/286

문제

JOI나라에는 N개의 도시가 있고, 각 도시에 1,2,...,N까지의 번호를 갖고 있다.

그리고, 철도가 N-1개 있고, 각 철도에 1,2,...N-1의 번호를 갖고 있다.

철도 i (1 ≦ i ≦ N − 1)는 도시 i과 도시 i+1을 양방향으로 연결시키는 철도를 의미한다.

JOI나라의 철도를 타는 방법에는, 티켓을 구입해 승차하는 방법과 IC카드로 승차하는 방법 두 가지가 존재한다.

  • 철도 i에 티켓을 구입해 승차할 때는 Ai 원의 비용이 든다.
  • 철도 i에 IC카드로 승차하는 경우에는 Bi 원의 비용이 든다. 하지만 IC카드로 철도를 탈 때는 IC카드를 미리 구입해둬야만 한다. 철도 i에서 쓸 수 있는 IC카드를 구입하는데는 Ci원의 비용이 든다. 한번 구입한 IC카드는 몇번이라도 사용할 수 있다.

IC카드가 처리가 간편하기 때문에, IC카드로 승차하는 방법의 운임이 티켓을 구입하는 경우보다 싸다. 즉, i = 1,2,...N-1일 때 Ai > Bi이다. IC카드는 철도마다 다르기 때문에, 철도 i에서 사용할 수 있는 카드는 다른 철도에서는 사용할 수 없다.

당신은 JOI나라를 여행하기로 마음먹었다. 도시 P1에서 출발해, P2,P3... ,PM 순서의 도시를 방문할 예정이다. 여행은 M-1일간 이루어진다. j일째 (1 ≦ j ≦ M − 1) 에 도시 Pj으로부터 Pj+1으로 이동한다. 이때, 여러 개의 철도를 타는 경우도 있고, 같은 도시를 여러 번 방문할 수도 있다. JOI나라의 철도는 빨라서 어느 도시도 하루만에 도착할 수 있다

당신은 현재 어느 철도의 IC카드도 갖고있지 않다. 당신은 미리 몇개의 IC카드를 구입해, 이 여행에서 사용되는 비용, 즉 IC카드를 구입하는 비용 + 철도를 타는 비용을 최소화하고 싶다.

JOI나라의 도시 수, 여행의 기간, 그리고 JOI나라의 철도 각각의 운임과, IC카드의 가격이 주어졌을 때, 여행의 비용을 최소화하는 프로그램을 작성하시오.

# 10713
import sys
input = lambda: sys.stdin.readline().strip()

# 1. count_arr (count_arr[i] : i 이동 횟수)
# 2. sum

n, m = map(int, input().split())
arr = list(map(int, input().split()))

count_arr = [0] * (n+1)
for i in range(m-1):
    start, end = arr[i], arr[i+1]
    if start > end:
        start, end = end, start
    count_arr[start-1] += 1
    count_arr[end-1] -= 1
    
charge = [list(map(int, input().split())) for _ in range(n-1)]
    
total_money, count = 0, 0
for i in range(n-1):
    count += count_arr[i]
    money1 = charge[i][0] * count
    money2 = charge[i][2] + charge[i][1] * count
    total_money += min(money1, money2)
    
print(total_money)

백준 10713 기차 여행

0개의 댓글