#include <bits/stdc++.h>
using namespace std;
vector<string> split(const string& s, char c) {
  vector<string> v;
  stringstream ss(s);
  string x;
  while (getline(ss, x, c)) v.emplace_back(x);
  return move(v);
}
void err(vector<string>::iterator it) {}
template <typename T, typename... Args>
void err(vector<string>::iterator it, T a, Args... args) {
  cerr << it->substr((*it)[0] == ' ', it->length()) << " = " << a << '\n';
  err(++it, args...);
}
int cpd(double X, double Y) {
  if (X - Y > 0.00000001) return 1;
  if (X - Y < -0.00000001) return -1;
  return 0;
}
const int NMAX = 2005;
int n, A, B;
double p[NMAX], u[NMAX], dp[2][NMAX][NMAX];
int main() {
  int i;
  cin.sync_with_stdio(false);
  cin >> n >> A >> B;
  for (i = 1; i <= n; i++) cin >> p[i];
  for (i = 1; i <= n; i++) cin >> u[i];
  int j, l, ok;
  for (i = 1, ok = 1; i <= n; i++, ok = 1 - ok) {
    int mxa = min(i, A);
    int mxb = min(i, B);
    int mna = max(0, A - (n - i));
    int mnb = max(0, B - (n - i));
    for (j = mna; j <= mxa; j++)
      for (l = mnb; l <= mxb; l++) {
        dp[ok][j][l] = dp[1 - ok][j][l];
        if (j && cpd(dp[1 - ok][j - 1][l] + p[i], dp[ok][j][l]) == 1)
          dp[ok][j][l] = dp[1 - ok][j - 1][l] + p[i];
        if (l && cpd(dp[1 - ok][j][l - 1] + u[i], dp[ok][j][l]) == 1)
          dp[ok][j][l] = dp[1 - ok][j][l - 1] + u[i];
        if (j && l &&
            cpd(dp[1 - ok][j - 1][l - 1] + p[i] + (1 - p[i]) * u[i],
                dp[ok][j][l]) == 1)
          dp[ok][j][l] = dp[1 - ok][j - 1][l - 1] + p[i] + (1 - p[i]) * u[i];
      }
  }
  double sol = 0;
  for (i = 0; i <= A; i++)
    for (j = 0; j <= B; j++)
      if (cpd(dp[1 - ok][i][j], sol) == 1) sol = dp[1 - ok][i][j];
  cout << setprecision(8) << fixed;
  cout << sol << "\n";
  return 0;
}
