Problem:
Score : 500 points

Problem Statement

In CODE FESTIVAL XXXX, there are N+1 participants from all over the world, including Takahashi.

Takahashi checked and found that the time gap (defined below) between the local times in his city and the i-th person's city was D_i hours.
The time gap between two cities is defined as follows. For two cities A and B, if the local time in city B is d o'clock at the moment when the local time in city A is 0 o'clock, then the time gap between these two cities is defined to be min(d,24-d) hours.
Here, we are using 24-hour notation.
That is, the local time in the i-th person's city is either d o'clock or 24-d o'clock at the moment when the local time in Takahashi's city is 0 o'clock, for example.

Then, for each pair of two people chosen from the N+1 people, he wrote out the time gap between their cities. Let the smallest time gap among them be s hours.

Find the maximum possible value of s.

Constraints

1 \leq N \leq 50

0 \leq D_i \leq 12

All input values are integers.

Input

Input is given from Standard Input in the following format:

N
D_1 D_2 ... D_N

Output

Print the maximum possible value of s.

Sample Input 1

3
7 12 8

Sample Output 1

4

For example, consider the situation where it is 7, 12 and 16 o'clock in each person's city at the moment when it is 0 o'clock in Takahashi's city. In this case, the time gap between the second and third persons' cities is 4 hours.

Sample Input 2

2
11 11

Sample Output 2

2

Sample Input 3

1
0

Sample Output 3

0

Note that Takahashi himself is also a participant.

Solution in C (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) > (b) ? (b) : (a))
#define abs(x) ((x) > 0 ? (x) : -(x))
#define MOD (ll)1000000007 //10^9 + 7
#define endl printf("\n")
typedef long long ll;
#define MAX_N (1 << 17)

int ans = INT_MIN;
int d[55], n, c[55], tmp[55];

int asc(const void *a, const void *b) {
  return *(int *)a - *(int *)b;
}

void dfs(int i) {
  if (i == n) {
    c[n] = 0;
    for (int j = 0; j < n + 1; j++) tmp[j] = c[j];
    qsort(tmp, n + 1, sizeof(int), asc);
    
    int min = INT_MAX;
    for (int j = 0; j < n; j++)
      min = Min(min, Min(tmp[j + 1] - tmp[j], 24 + tmp[j] - tmp[j + 1]));
    
    min = Min(min, 24 + tmp[0] - tmp[n]);
    ans = Max(ans, min);
    return;
  }
  c[i] = d[i];
  dfs(i + 1);
  c[i] = - d[i];
  dfs(i + 1);

  return;
}

int
main(int argc, char *argv[])
{
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", &d[i]);

  if (n >= 24) printf("0\n");
  else {
    dfs(0);
    printf("%d\n", ans);
  }

  return 0;
}