#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using Vi = vector<int>;
using Pii = pair<int, int>;
int n, a, b;
vector<double> p, q;
pair<double, Pii> check(double ka, double kb) {
  pair<double, Pii> ret = {0, {0, 0}};
  for (int i = (0); i < (n); i++) {
    pair<double, Pii> alt1 = {ret.first + p[i] - ka,
                              {ret.second.first + 1, ret.second.second}};
    pair<double, Pii> alt2 = {ret.first + q[i] - kb,
                              {ret.second.first, ret.second.second + 1}};
    pair<double, Pii> alt3 = {ret.first + p[i] + q[i] - p[i] * q[i] - ka - kb,
                              {ret.second.first + 1, ret.second.second + 1}};
    ret = max(max(max(ret, alt1), alt2), alt3);
  }
  return ret;
}
template <class T, class F>
T parametricSearch(double begin, double end, int wanted, F func) {
  for (int i = (0); i < (40); i++) {
    double mid = (begin + end) / 2;
    pair<T, int> ret = func(mid);
    if (ret.second < wanted) {
      end = mid;
    } else if (ret.second > wanted) {
      begin = mid;
    } else {
      return ret.first;
    }
  }
  return func(begin).first;
}
int main() {
  cin.sync_with_stdio(0);
  cout << fixed << setprecision(4);
  cin >> n >> a >> b;
  p.resize(n);
  q.resize(n);
  for (auto& k : (p)) cin >> k;
  for (auto& k : (q)) cin >> k;
  double ans = parametricSearch<double>(0, 1, a, [](double ka) {
    return parametricSearch<pair<double, int>>(0, 1, b, [ka](double kb) {
      auto tmp = check(ka, kb);
      tmp.first += ka * a + kb * b;
      return make_pair(make_pair(tmp.first, tmp.second.first),
                       tmp.second.second);
    });
  });
  cout << ans << endl;
  return 0;
}
