#include <bits/stdc++.h>
using namespace std;
template <class T>
inline void read(T &x) {
  x = 0;
  T flag = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') flag = -1;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  x *= flag;
}
int S, T, flow, head[2500], tot = 1, pre[2500];
struct edge {
  int u, v, c, next;
  double w;
} e[20001];
double dis[2500], cost;
queue<int> q;
bool inq[2500];
inline void insert(int u, int v, int c, double w) {
  e[++tot].u = u, e[tot].v = v, e[tot].c = c, e[tot].w = w,
  e[tot].next = head[u], head[u] = tot;
}
inline void add(int u, int v, int c, double w) {
  insert(u, v, c, w), insert(v, u, 0, -w);
}
inline bool spfa() {
  for (int i = S; i <= T; i++) dis[i] = 0x3f3f3f3f;
  dis[S] = 0;
  q.push(S);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    inq[u] = 0;
    double w;
    for (int i = head[u], v; i; i = e[i].next)
      if (e[i].c > 0 && dis[v = e[i].v] - dis[u] - (w = e[i].w) > (1e-8)) {
        dis[v] = dis[u] + w, pre[v] = i;
        if (!inq[v]) q.push(v);
        inq[v] = 1;
      }
  }
  return dis[T] != 0x3f3f3f3f;
}
inline void mcf() {
  int d = 0x3f3f3f3f;
  for (int i = T; (i ^ S); i = e[pre[i]].u) d = min(d, e[pre[i]].c);
  flow += d;
  for (int i = T; (i ^ S); i = e[pre[i]].u)
    e[pre[i]].c -= d, e[pre[i] ^ 1].c += d, cost += d * e[pre[i]].w;
}
int n, a, b, A, B;
double p1[2500], p2[2500];
int main() {
  read(n), read(a), read(b);
  for (int i = 1; i <= n; i++) scanf("%lf", &p1[i]);
  for (int i = 1; i <= n; i++) scanf("%lf", &p2[i]);
  A = n + 1, B = A + 1, T = B + 1;
  add(S, A, a, 0), add(S, B, b, 0);
  for (int i = 1; i <= n; i++)
    add(A, i, 1, -p1[i]), add(B, i, 1, -p2[i]), add(i, T, 1, 0),
        add(i, T, 1, p1[i] * p2[i]);
  while (spfa()) mcf();
  printf("%.6lf", -cost);
  return 0;
}
