본문 바로가기

카테고리 없음

[백준 18186번] 라면 사기 (Large)

N,B,C = map(int,input().split())
A = [*map(int,input().split())]

if B <= C:
  print(sum(A)*B)
else:
  cost = i = 0
  while i < N:
    if not A[i]:
      i += 1
      continue
    if i == N-1 or A[i+1] == 0:
      cost += A[i]*B
      i += 1
      continue
    if i == N-2 or A[i+2] == 0:
      cost += min(A[i],A[i+1])*(B+C)
      cost += abs(A[i]-A[i+1])*B
      i += 2
      continue
    if A[i+1]>A[i] and A[i+1]>A[i+2]:
      MIN = min(A[i],A[i+1]-A[i+2])
      cost += MIN*(B+C)
      A[i] -= MIN
      A[i+1] -= MIN
      continue
    MIN = min(A[i],A[i+1],A[i+2])
    cost += MIN*(B+C*2)
    A[i] -= MIN
    A[i+1] -= MIN
    A[i+2] -= MIN
  print(cost)

라면 사기 small [백준 18185번] 라면 사기 (Small) (tistory.com) 의 확장버전이다.

 

라면 사기 small과 풀이 자체는 완전히 똑같다. 3,5,7을 B,B+C,B+2C로 나타냈을 뿐이다.

다만 주의해야 할 것이 B가 C보다 작은 경우이다. B가 C보다 작으면 그냥 모든 라면을 1개씩 사는게 이득이기 때문에 모든 라면을 B원에 구매하면 된다.

 

 

오늘의 교훈) 반례를 항상 조심하자