#include <stdio.h>
int main() {
int N;
scanf("%d", &N);
int x[N + 1]; // 1부터 N까지 저장할 배열이다
x[1] = 0; // 1은 이미 1이므로 연산 횟수가 0
//동적 계획법을 for문을 이용해 사용한다
for (int i = 2; i <= N; i++) {
x[i] = x[i - 1] + 1; // 1을 빼는 연산이다. 언제든 가능하니 if문을 쓰지 않는다
if (i % 2 == 0 && x[i] > x[i / 2] + 1) {
x[i] = x[i / 2] + 1; // 2로 나누는 연산
}
if (i % 3 == 0 && x[i] > x[i / 3] + 1) {
x[i] = x[i / 3] + 1; // 3으로 나누는 연산
}
}
//N에 10을 입력할 경우 1부터 10까지 전부 각각의 최소 계산 횟수를 확인한다
printf("%d\n", x[N]);
return 0;
}
#include <stdio.h>
#include <stdlib.h> // llabs를 사용하기 위해서다(long long타입의 정수 절댓값)
#define ll long long //long long은 길어서 이렇게 해준다
ll min(ll a, ll b) { return a < b ? a : b; }
ll max(ll a, ll b) { return a > b ? a : b; }
//각각 min과 max를 반환한다
int main() {
ll X, Y, W, S;
scanf("%lld %lld %lld %lld", &X, &Y, &W, &S);
ll T1 = (X + Y) * W; // 전부 직선일 때
ll T2 = min(X, Y) * S + llabs(X - Y) * W; // 대각선과 직선이 섞인다
ll T3; //전부 대각선일 때
if ((X + Y) % 2 == 0) {
T3 = max(X, Y) * S; // 둘 다 대각선으로 끝낼 수 있음
} else {
T3 = (max(X, Y) - 1) * S + W; // 마지막 1블록은 직선으로
}
ll result = min(T1, min(T2, T3));
printf("%lld\n", result);
return 0;
}