#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;   }   