#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
const double eps = 1e-7, Inf = 1e9 + 7;
int n, a, b, S, T, d[MAXN];
int tot, Last[MAXN], Go[MAXN], Next[MAXN], Len[MAXN];
double ans, p[MAXN], q[MAXN], dis[MAXN], Cost[MAXN];
bool flag[MAXN], bz[MAXN];
void open(int u, int v, int fl, double w) {
  Next[++tot] = Last[u], Last[u] = tot, Go[tot] = v, Len[tot] = fl,
  Cost[tot] = w;
}
void link(int u, int v, int fl, double w) {
  open(u, v, fl, w), open(v, u, 0, -w);
}
int Dfs(int now, int flow) {
  if (now == T) {
    ans += flow * dis[T];
    return flow;
  }
  int use = 0;
  bz[now] = 1;
  for (int p = Last[now]; p; p = Next[p]) {
    int v = Go[p];
    if (Len[p] > 0 && fabs(dis[now] + Cost[p] - dis[v]) < eps && !bz[v]) {
      int t = Dfs(v, min(flow - use, Len[p]));
      Len[p] -= t, Len[p ^ 1] += t, use += t;
      if (use == flow) return use;
    }
  }
  return use;
}
void solve() {
  while (1 == 1) {
    memset(bz, 0, sizeof bz);
    for (int i = 0; i <= T + 1; i++) dis[i] = -Inf;
    int l = 0, r = 1;
    d[1] = S, dis[S] = 0, flag[S] = 1;
    while (l != r) {
      l = (l + 1) % MAXN;
      int now = d[l];
      for (int p = Last[now]; p; p = Next[p]) {
        int v = Go[p];
        if (Len[p] > 0 && dis[now] + Cost[p] > dis[v] + eps) {
          dis[v] = dis[now] + Cost[p];
          if (!flag[v]) {
            flag[v] = 1;
            r = (r + 1) % MAXN;
            d[r] = v;
          }
        }
      }
      flag[now] = 0;
    }
    if (dis[T] == dis[T + 1]) return;
    Dfs(S, Inf);
  }
}
int main() {
  scanf("%d%d%d", &n, &a, &b);
  for (int i = 1; i <= n; i++) scanf("%lf", &p[i]);
  for (int i = 1; i <= n; i++) scanf("%lf", &q[i]);
  S = 0, T = 3 + n, tot = 1;
  link(S, n + 1, a, 0);
  link(S, n + 2, b, 0);
  for (int i = 1; i <= n; i++) {
    link(n + 1, i, 1, p[i]), link(n + 2, i, 1, q[i]);
    link(i, T, 1, 0), link(i, T, 1, -p[i] * q[i]);
  }
  solve();
  printf("%.10lf\n", ans);
}
