using
System;
using
System.Collections.Generic;
class
X : IComparer<Pair> {
public
int
Compare(Pair a, Pair b) {
return
a.Second.CompareTo(b.Second);
}
}
class
Pair {
public
int
First {
get
;
set
; }
public
int
Second {
get
;
set
; }
public
Pair(
int
first,
int
second) {
First = first;
Second = second;
}
}
class
GFG {
static
int
MinCost(
int
n,
int
a,
int
b,
int
c) {
int
ans = 0;
bool
[] vis =
new
bool
[2 * n];
PriorityQueue<Pair> pq =
new
PriorityQueue<Pair>(
new
X());
pq.Enqueue(
new
Pair(1, 0));
while
(pq.Count > 0) {
Pair f = pq.Dequeue();
if
(f.First == n) {
ans = f.Second;
break
;
}
if
(vis[f.First] ==
true
)
continue
;
vis[f.First] =
true
;
if
(2 * f.First < 2 * n && vis[2 * f.First] ==
false
) {
pq.Enqueue(
new
Pair(2 * f.First, f.Second + a));
}
if
(f.First + 1 < 2 * n && vis[f.First + 1] ==
false
) {
pq.Enqueue(
new
Pair(f.First + 1, f.Second + b));
}
if
(f.First - 1 > 1 && vis[f.First - 1] ==
false
) {
pq.Enqueue(
new
Pair(f.First - 1, f.Second + c));
}
}
return
ans;
}
public
static
void
Main(
string
[] args) {
int
n = 31;
int
a = 2;
int
b = 1;
int
c = 3;
Console.WriteLine(MinCost(n, a, b, c));
}
public
class
PriorityQueue<T> {
private
List<T> data;
private
IComparer<T> comparer;
public
PriorityQueue(IComparer<T> comparer) {
this
.data =
new
List<T>();
this
.comparer = comparer;
}
public
void
Enqueue(T item) {
data.Add(item);
int
ci = data.Count - 1;
while
(ci > 0) {
int
pi = (ci - 1) / 2;
if
(comparer.Compare(data[ci], data[pi]) >= 0)
break
;
T tmp = data[ci]; data[ci] = data[pi]; data[pi] = tmp;
ci = pi;
}
}
public
T Dequeue() {
int
li = data.Count - 1;
T frontItem = data[0];
data[0] = data[li];
data.RemoveAt(li);
--li;
int
pi = 0;
while
(
true
) {
int
ci = pi * 2 + 1;
if
(ci > li)
break
;
int
rc = ci + 1;
if
(rc <= li && comparer.Compare(data[rc], data[ci]) < 0)
ci = rc;
if
(comparer.Compare(data[pi], data[ci]) <= 0)
break
;
T tmp = data[pi]; data[pi] = data[ci]; data[ci] = tmp;
pi = ci;
}
return
frontItem;
}
public
T Peek() {
T frontItem = data[0];
return
frontItem;
}
public
int
Count => data.Count;
}
}