#include <bits/stdc++.h>
using namespace std;
const int siz = 2e2 + 1, _siz = siz * siz;
const double epsilon = 1e-10;
struct edge {
  int v;
  double w;
  int nxt;
} e[_siz];
int n;
int cnt[siz], head[_siz];
double p[siz], dis[siz];
bitset<siz> in;
bool SPFA(double mid);
void add_edge(int u, int v, double w);
int main() {
  scanf("%d", &n);
  for (int i = 0; i <= n; i++) scanf("%lf", &p[i]);
  for (int i = 0; i <= (n << 1); i++)
    for (int j = 0; j <= (n << 1); j++)
      if (abs(i - j) <= n && ((i - j) & 1) == (n & 1))
        add_edge(i, j, p[(n + i - j) >> 1]);
  double l = 0, r = 1;
  while (r - l > epsilon) {
    double mid = (l + r) / 2;
    if (SPFA(mid))
      l = mid;
    else
      r = mid;
  }
  printf("%.10f\n", l);
  return 0;
}
bool SPFA(double mid) {
  in.reset();
  memset(cnt, 0, sizeof cnt);
  memset(dis, 0xdd, sizeof dis);
  queue<int> q;
  q.push(1);
  in[1] = true;
  dis[1] = 0;
  cnt[1] = 1;
  while (!q.empty()) {
    int now = q.front();
    q.pop();
    in[now] = false;
    for (int i = head[now]; i != 0; i = e[i].nxt) {
      double w = e[i].w - mid;
      if (dis[now] + w > dis[e[i].v]) {
        dis[e[i].v] = dis[now] + w;
        cnt[e[i].v] = cnt[now] + 1;
        if (cnt[e[i].v] > (n << 1)) return true;
        if (!in[e[i].v]) {
          in[e[i].v] = true;
          q.push(e[i].v);
        }
      }
    }
  }
  return false;
}
void add_edge(int u, int v, double w) {
  static int cnt;
  e[++cnt] = (edge){v, w, head[u]};
  head[u] = cnt;
}
