#include <bits/stdc++.h>
using namespace std;
const int Inf = 1e9;
const double eps = 1e-7;
inline int read() {
  int s = 0, m = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') m = 1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + (ch ^ 48), ch = getchar();
  return m ? -s : s;
}
int n;
queue<int> Q;
double P[150], dis[150 << 1], Ans;
int hd[150 << 1], in[150 << 1], vis[150 << 1], cnt;
struct EDGE {
  int to, nxt;
  double v;
} ljl[10050 << 1];
inline void Add(int p, int q, double o) {
  ljl[++cnt] = (EDGE){q, hd[p], o}, hd[p] = cnt;
}
inline int Calc(double x, double y) { return abs(x - y) <= eps ? 2 : x < y; }
inline bool check(double lim) {
  for (register int i = 0; i <= (n << 1); ++i) dis[i] = Inf, in[i] = vis[i] = 0;
  while (!Q.empty()) Q.pop();
  Q.push(0), dis[0] = 0, in[0] = 1;
  while (!Q.empty()) {
    register int now = Q.front();
    Q.pop(), in[now] = 0;
    for (register int i = hd[now]; i; i = ljl[i].nxt)
      if (!Calc(dis[ljl[i].to], dis[now] + lim - ljl[i].v)) {
        dis[ljl[i].to] = dis[now] + lim - ljl[i].v;
        if (++vis[ljl[i].to] > n) return 1;
        if (!in[ljl[i].to]) in[ljl[i].to] = 1, Q.push(ljl[i].to);
      }
  }
  return 0;
}
int main() {
  n = read();
  for (register int i = 0; i <= n; ++i) {
    scanf("%lf", &P[i]);
    register int hurt = n - (i << 1);
    if (hurt > 0)
      for (register int j = 0; j + hurt <= (n << 1); ++j)
        Add(j, j + hurt, P[i]);
    else
      for (register int j = (n << 1); j + hurt >= 0; --j)
        Add(j, j + hurt, P[i]);
  }
  double le = 0, ri = 1, mid;
  while (Calc(le, ri)) {
    mid = (le + ri) / 2;
    if (check(mid))
      Ans = mid, le = mid + eps;
    else
      ri = mid - eps;
  }
  printf("%.10lf\n", Ans);
  return 0;
}
