#include <bits/stdc++.h>
using namespace std;
const int N = 2005;
struct poke {
  double p, q;
} srt[N];
inline bool cmp1(poke a, poke b) {
  return a.p > b.p || a.p == b.p && a.q > b.q;
}
inline bool cmp2(poke a, poke b) { return a.p - a.p * a.q > b.p - b.p * b.q; }
double f[N];
int n, a, b;
double ans, sum;
multiset<double> heap;
void calc() {
  ans = 0., sort(srt + 1, srt + 1 + n, cmp1);
  for (int i = a; i <= n; ++i) {
    if (i - a > b) break;
    sort(srt + 1, srt + 1 + i, cmp2), heap.clear();
    double cur = sum = f[i + 1] = 0.;
    for (int j = i; j >= 1; --j) {
      heap.insert(srt[j].q - srt[j].p), sum += srt[j].q - srt[j].p;
      if ((int)heap.size() > i - a)
        sum -= *heap.begin(), heap.erase(heap.begin());
      f[j] = sum, cur += srt[j].p;
    }
    heap.clear();
    for (int j = i + 1; j <= n; ++j) {
      heap.insert(srt[j].q), cur += srt[j].q;
      if ((int)heap.size() > b - (i - a))
        cur -= *heap.begin(), heap.erase(heap.begin());
    }
    for (int j = 0; j <= i; ++j) {
      if (j > a) break;
      if (j)
        heap.insert(srt[j].q - srt[j].p * srt[j].q),
            cur += srt[j].q - srt[j].p * srt[j].q;
      if ((int)heap.size() > b - (i - a))
        cur -= *heap.begin(), heap.erase(heap.begin());
      if ((int)heap.size() == b - (i - a)) ans = max(ans, cur + f[j + 1]);
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &a, &b);
  for (int i = 1; i <= n; ++i) scanf("%lf", &srt[i].p);
  for (int i = 1; i <= n; ++i) scanf("%lf", &srt[i].q);
  calc(), printf("%.6lf\n", ans);
  return 0;
}
