#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int res = 0, f = 1;
  char ch;
  while (!isdigit(ch = getchar()))
    if (ch == '-') f = -1;
  do {
    res = res * 10 + ch - '0';
  } while (isdigit(ch = getchar()));
  return res * f;
}
const int N = 2e5 + 5;
const long double eps = 1e-10;
struct Edge {
  int next, from, to, flow;
  long double cost;
} a[N << 1];
int head[N], size = 1;
inline void add(int u, int v, int w, long double c) {
  a[++size].next = head[u], a[size].from = u, a[size].to = v, a[size].flow = w,
  a[size].cost = c, head[u] = size;
}
inline void insert(int u, int v, int w, long double c) {
  add(u, v, w, c), add(v, u, 0, -c);
}
long double dis[N];
int f[N], pre[N], inq[N], n, numa, numb, s, t, ss, sss, A, B;
long double cost;
inline bool spfa() {
  for (register int i = s; i <= t; ++i) dis[i] = -1, f[i] = 0;
  queue<int> q;
  q.push(s), dis[s] = 0, f[s] = 0x3fffffff;
  while (!q.empty()) {
    int u = q.front();
    q.pop(), inq[u] = 0;
    for (register int i = head[u]; i; i = a[i].next) {
      int v = a[i].to;
      if (a[i].flow && dis[v] < dis[u] + a[i].cost - eps) {
        f[v] = min(f[u], a[i].flow);
        dis[v] = dis[u] + a[i].cost;
        pre[v] = i;
        if (!inq[v]) q.push(v), inq[v] = 1;
      }
    }
  }
  if (!f[t]) return 0;
  cost += 1.0 * f[t] * dis[t];
  for (register int u = t; u != s; u = a[pre[u]].from) {
    a[pre[u]].flow -= f[t];
    a[pre[u] ^ 1].flow += f[t];
  }
  return 1;
}
inline void EK() {
  while (spfa())
    ;
}
long double pa[N], pb[N];
int main() {
  n = read(), A = read(), B = read(), s = 0, ss = n + 1, sss = ss + 1,
  t = sss + 1;
  for (register int i = 1; i <= n; ++i) cin >> pa[i];
  for (register int i = 1; i <= n; ++i) cin >> pb[i];
  insert(s, ss, A, 0), insert(s, sss, B, 0);
  for (register int i = 1; i <= n; ++i) {
    insert(ss, i, 1, pa[i]);
    insert(sss, i, 1, pb[i]);
    insert(i, t, 1, 0);
    insert(i, t, 1, -pa[i] * pb[i]);
  }
  EK();
  float ww = cost;
  cout << ww;
  return 0;
}
