#include <bits/stdc++.h>
struct SJd {
  int p, t;
};
bool operator!=(SJd a, SJd b) { return 1ll * a.p * b.t != 1ll * b.p * a.t; }
int cmp(const void* A, const void* B) {
  SJd a = *(SJd*)A, b = *(SJd*)B;
  if (1ll * a.p * b.t > 1ll * b.p * a.t)
    return -1;
  else if (1ll * a.p * b.t < 1ll * b.p * a.t)
    return 1;
  return 0;
}
SJd sz[150010];
struct SPx {
  int p, i;
  SPx() {}
  SPx(int P, int I) {
    p = P;
    i = I;
  }
};
SPx px[150010];
int cmp2(const void* a, const void* b) { return ((SPx*)a)->p - ((SPx*)b)->p; }
long long su[150010], T;
double zx[150010], zd[150010];
bool check(double c, int n) {
  for (int i = 0, la = 0; i < n; i++) {
    su[i] = sz[i].t;
    if (i > 0) su[i] += su[i - 1];
    if (i == n - 1 || sz[i] != sz[i + 1]) {
      long long h = (la == 0 ? 0 : su[la - 1]);
      for (int j = la; j <= i; j++) {
        zd[j] = sz[j].p * (1 - c * (h + sz[j].t) / T);
        zx[j] = sz[j].p * (1 - c * su[i] / T);
      }
      la = i + 1;
    }
  }
  double ma = 0;
  for (int i = 0, la = 0; i < n; i++) {
    if (i == n - 1 || px[i].p != px[i + 1].p) {
      for (int j = la; j <= i; j++) {
        if (ma - zx[px[j].i] > 1e-8) return false;
      }
      for (int j = la; j <= i; j++) {
        if (zd[px[j].i] > ma) ma = zd[px[j].i];
      }
      la = i + 1;
    }
  }
  return true;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) scanf("%d", &sz[i].p);
  for (int i = 0; i < n; i++) {
    scanf("%d", &sz[i].t);
    T += sz[i].t;
  }
  qsort(sz, n, sizeof(SJd), cmp);
  for (int i = 0; i < n; i++) px[i] = SPx(sz[i].p, i);
  qsort(px, n, sizeof(SPx), cmp2);
  double l = 0, r = 1;
  for (int s = 0; s < 50; s++) {
    double m = (l + r) / 2;
    if (check(m, n))
      l = m;
    else
      r = m;
  }
  printf("%.10lf", l);
  return 0;
}
