#include <bits/stdc++.h>
using namespace std;
namespace rd {
const int L = 1 << 16;
char buf[L], *S, *T;
inline char Gc() {
  if (S == T) {
    T = (S = buf) + fread(buf, 1, L, stdin);
    if (S == T) return EOF;
  }
  return *S++;
}
inline char Gc_() { return getchar(); }
char c;
inline int d() {
  int f = 1, x;
  for (c = Gc(); c > '9' || c < '0'; c = Gc())
    if (c == '-') f = -1;
  for (x = 0; c >= '0' && c <= '9'; c = Gc()) x = (x << 1) + (x << 3) + c - '0';
  return x * f;
}
inline long long lld() {
  long long f = 1, x;
  for (c = Gc(); c > '9' || c < '0'; c = Gc())
    if (c == '-') f = -1;
  for (x = 0; c >= '0' && c <= '9'; c = Gc()) x = (x << 1) + (x << 3) + c - '0';
  return x * f;
}
inline double lf() {
  double f = 1, x, y = 0.1;
  for (c = Gc(); c > '9' || c < '0'; c = Gc())
    if (c == '-') f = -1;
  for (x = 0; c >= '0' && c <= '9'; c = Gc()) x = x * 10 + c - '0';
  if (c == '.')
    for (c = Gc(); c >= '0' && c <= '9'; c = Gc())
      x = x + (c - '0') * y, y *= 0.1;
  return x * f;
}
}  // namespace rd
const int N = 2e3 + 10;
const int P = 3e3;
const int M = 2e4;
const int A = 1e5;
const int inf = 1e9;
int n, a, b, p, s, t, poke, ultra, fans, cans;
double po[N], ul[N];
struct edge {
  int adj, nex, fw, r;
} e[M];
int g[P], top = 1;
void add(int x, int y, int z, int w) {
  e[++top] = (edge){y, g[x], z, w};
  g[x] = top;
}
void Add(int x, int y, int z, int w) { add(x, y, z, w), add(y, x, 0, -w); }
int dep[P], cur[P];
bool vis[P];
queue<int> Q;
bool spfa() {
  for (int i = 1; i <= p; i++) vis[i] = 0, dep[i] = inf, cur[i] = g[i];
  Q.push(s), vis[s] = 1, dep[s] = 0;
  while (Q.size()) {
    int x = Q.front();
    Q.pop();
    vis[x] = 0;
    for (int i = g[x]; i; i = e[i].nex) {
      int to = e[i].adj, d = e[i].r;
      if (e[i].fw && dep[to] > dep[x] + d) {
        dep[to] = dep[x] + d;
        if (!vis[to]) {
          vis[to] = 1;
          Q.push(to);
        }
      }
    }
  }
  return dep[t] != inf;
}
int dfs(int x, int F) {
  if (!F || x == t) return F;
  int flow = 0, f;
  vis[x] = 1;
  for (int i = cur[x]; i; i = e[i].nex) {
    int to = e[i].adj;
    cur[x] = i;
    if (!vis[to] && dep[x] + e[i].r == dep[to] &&
        (f = dfs(to, min(F, e[i].fw))) > 0) {
      e[i].fw -= f;
      e[i ^ 1].fw += f;
      flow += f, F -= f;
      if (!F) {
        vis[x] = 0;
        break;
      }
    }
  }
  return flow;
}
int main() {
  n = rd::d(), a = rd::d(), b = rd::d();
  p = t = n + 4, s = t - 3, poke = t - 2, ultra = t - 1;
  Add(s, poke, a, 0), Add(s, ultra, b, 0);
  for (int i = 1; i <= n; i++) {
    po[i] = rd::lf();
    Add(poke, i, 1, -po[i] * A);
  }
  for (int i = 1; i <= n; i++) {
    ul[i] = rd::lf();
    Add(ultra, i, 1, -ul[i] * A);
  }
  for (int i = 1; i <= n; i++) Add(i, t, 1, 0), Add(i, t, 1, po[i] * ul[i] * A);
  while (spfa()) {
    int D = dfs(s, inf);
    fans += D, cans += D * dep[t];
  }
  printf("%.5lf\n", -0.00001 * cans);
  return 0;
}
