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원에 구매하면 된다.
오늘의 교훈) 반례를 항상 조심하자