static int N, maximum, minimum;
static int ops[4]; //0: +, 1: -, 2: *, 3: /
static int numbers[12];
static int sel[11];
static void __solution(int idx, int st)
{
if (idx == 4)
{
int v = numbers[0];
for (int i = 0, j = 1; i < N - 1; i++, j++)
{
switch (sel[i])
{
case 0:
v += numbers[j];
break;
case 1:
v -= numbers[j];
break;
case 2:
v *= numbers[j];
break;
case 3:
v /= numbers[j];
break;
}
}
if (v > maximum)
maximum = v;
if (v < minimum)
minimum = v;
return;
}
if (!ops[idx])
__solution(idx + 1, 0);
else
{
ops[idx] -= 1;
for (int s = st; s < N - 1; s++)
{
if (sel[s] < 0)
{
sel[s] = idx;
__solution(idx, s + 1);
sel[s] = -1;
}
}
ops[idx] += 1;
}
}
static int solution(void)
{
scanf("%d", &N);
for (int i = 0; i < 4; i++)
scanf("%d", &ops[i]);
for (int i = 0; i < N; i++)
scanf("%d", &numbers[i]);
memset(sel, -1, sizeof(sel));
maximum = -100000001;
minimum = 100000001;
__solution(0, 0);
memset(ops, 0, sizeof(ops));
memset(numbers, 0, sizeof(numbers));
return maximum - minimum;
}
연산자를 같은 것이 있는 순열로 생각하여 구현을 하였다.
그래서 일단 연산자를 나열 할 수 만 있다면 나머지는 계산만 하면 되므로 간단히 풀 수 있다.