#include <bits/stdc++.h>
using namespace std;
struct Network {
  int N, source, sink;
  int M;
  struct Edge {
    int source, target, id, reverse;
  };
  vector<vector<Edge>> adjacency_list;
  vector<int> capacities, flows, costs;
  Network(const int N, const int source, const int sink)
      : N(N), source(source), sink(sink), M(0), adjacency_list(N) {}
  void add_edge(const int v, const int w, const int capacity, const int cost) {
    const auto id = M++;
    capacities.push_back(capacity);
    costs.push_back(cost);
    flows.push_back(0);
    const auto reverse = M++;
    capacities.push_back(0);
    costs.push_back(-cost);
    flows.push_back(0);
    adjacency_list[v].push_back({v, w, id, reverse});
    adjacency_list[w].push_back({w, v, reverse, id});
  }
  int mcmf() {
    auto cost = 0;
    while (true) {
      const auto infinity = numeric_limits<int>::max();
      auto distances = vector<int>(N, infinity);
      auto predecessors = vector<Edge>(N);
      auto queue = std::queue<int>();
      distances[source] = 0;
      queue.push(source);
      while (!queue.empty()) {
        const auto v = queue.front();
        queue.pop();
        const auto d = distances[v];
        for (const auto e : adjacency_list[v]) {
          if (flows[e.id] == capacities[e.id]) continue;
          const auto relax = d + costs[e.id];
          if (relax < distances[e.target]) {
            distances[e.target] = relax;
            predecessors[e.target] = e;
            queue.push(e.target);
          }
        }
      }
      if (distances[sink] == infinity)
        break;
      else {
        cost += distances[sink];
        for (auto v = sink; v != source; v = predecessors[v].source) {
          const auto e = predecessors[v];
          flows[e.id]++;
          flows[e.reverse]--;
        }
      }
    }
    return cost;
  }
};
int main() {
  ios::sync_with_stdio(false);
  cout << setprecision(4) << fixed;
  int n, a, b;
  cin >> n >> a >> b;
  auto p = vector<int>(n);
  for (auto i = 0; i < n; i++) {
    double x;
    cin >> x;
    p[i] = int(round(x * 1000));
  }
  auto u = vector<int>(n);
  for (auto i = 0; i < n; i++) {
    double x;
    cin >> x;
    u[i] = int(round(x * 1000));
  }
  auto source = n, sink = n + 1, pokeball = n + 2, ultraball = n + 3;
  auto network = Network(n + 4, source, sink);
  network.add_edge(source, pokeball, a, 0);
  network.add_edge(source, ultraball, b, 0);
  for (auto i = 0; i < n; i++) {
    network.add_edge(pokeball, i, 1, -p[i] * 1000);
    network.add_edge(ultraball, i, 1, -u[i] * 1000);
    network.add_edge(i, sink, 1, 0);
    network.add_edge(i, sink, 1, p[i] * u[i]);
  }
  cout << double(-network.mcmf()) / 1e6 << endl;
}
