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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <algorithm>
#include <climits>
#include <iostream>
#include <string>
#include <utility>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#include <cmath>
#include <stack>

using namespace std;
using ll = long long int;

template <class T> ostream &operator<<(ostream &os, vector<T> &v) {
  for (auto i = v.begin(); i != v.end(); i++) {
    os << *i << " ";
  }
  return os;
}

ll f(vector<ll> &d) {
  ll ans = 30;
  for(ll i=0; i<=25; i++) {
    for(ll j=i+1; j<=25; j++) {
      if(d[i]==0 or d[j]==0) continue;
      //std::cout << i << " "<<j << std::endl;
      ans = min(ans, j-i);
    }
  }
  return ans;
}

void solve(long long N, std::vector<long long> D){
  vector<ll> d(25, 0);
  ll ans = 0;
  for(ll i=0; i<N; i++) {
    d[D[i]]++;
  }
  if(d[0]>0) {
    std::cout << 0 << std::endl;
    return ;
  }
  d[0]=1;
  for(ll i=0; i<=12; i++) {
    if(d[i]==2) {
      d[24-i]++;
      d[i]--;
    } else if(d[i]>=3) {
      std::cout << 0 << std::endl;
      return;
    }
  }
  ans = f(d);
  //std::cout << d << std::endl;
  for(ll i=1; i<=(1<<11); i++) {
    vector<ll> v(25, 0);
    if(d[12]==1) v[12]=1;
    for(ll j=0; j<=11; j++) {
      if(i&(1<<j)) {
	if(d[j]==1 and d[24-j]==0)
	  v[24-j]=1;
	else if(d[j]==1 and d[24-j]==1) {
	  v[j]=1;v[24-j]=1;
	}
      }else {
	if(d[j]==1)
	  v[j]=1;
	if(d[24-j])
	  v[24-j]=1;
      }
      // else if(((i&(1<<j))==0) and d[j]==1 and d[24-j]==0)
      // 	v[j]=1;
      // else if(((i&(1<<j))==0) and d[24-j]==1)
      // 	v[24-j]=1;
    }
    //std::cout << v << std::endl;
    ans = max(ans, f(v));
  }
  std::cout << ans << std::endl;
}

int main(){
  long long N;
  scanf("%lld",&N);
  std::vector<long long> D(N);
  for(int i = 0 ; i < N ; i++){
    scanf("%lld",&D[i]);
  }
  solve(N, std::move(D));
  return 0;
}