#include <bits/stdc++.h>
const double INF = 1e9, EPS = 1e-9;
struct edge {
  int next, to, f;
  double w;
} e[2010 * 8];
int ei = 1;
int head[2010], fr[2010];
double dis[2010], p[2010];
bool inq[2010];
std::queue<int> q;
inline void add(const int &x, const int &y, const int &z, const double &w) {
  e[++ei].next = head[x];
  e[ei].to = y;
  e[ei].f = z;
  e[ei].w = w;
  head[x] = ei;
}
inline void adde(const int &x, const int &y, const int &z, const double &w) {
  add(x, y, z, w);
  add(y, x, 0, -w);
}
int main() {
  int n, a, b;
  scanf("%d%d%d", &n, &a, &b);
  adde(n + 3, n + 1, a, 0);
  adde(n + 3, n + 2, b, 0);
  for (int i = 1; i <= n; ++i) {
    scanf("%lf", p + i);
    adde(n + 1, i, 1, p[i]);
    adde(i, n + 4, 1, 0);
  }
  for (int i = 1; i <= n; ++i) {
    double u;
    scanf("%lf", &u);
    adde(n + 2, i, 1, u);
    adde(i, n + 4, 1, -p[i] * u);
  }
  double cost = 0.;
  while (true) {
    for (int i = 1; i <= n + 4; ++i) dis[i] = -INF;
    dis[n + 3] = 0;
    q.push(n + 3);
    while (!q.empty()) {
      const int f = q.front();
      q.pop();
      inq[f] = false;
      for (int i = head[f]; i; i = e[i].next) {
        if (e[i].f) {
          const int t = e[i].to;
          if (dis[t] < dis[f] + e[i].w - EPS) {
            dis[t] = dis[f] + e[i].w - EPS;
            fr[t] = i;
            if (!inq[t]) {
              q.push(t);
              inq[t] = true;
            }
          }
        }
      }
    }
    if (dis[n + 4] <= -INF) break;
    cost += dis[n + 4];
    for (int i = n + 4; i != n + 3; i = e[fr[i] ^ 1].to) {
      --e[fr[i]].f;
      ++e[fr[i] ^ 1].f;
    }
  }
  printf("%.5lf\n", cost);
  return 0;
}
