func_code_string: #include <bits/stdc++.h>   using namespace std;   double const eps = 1e-7;   struct Edge {     int dest, flow, ctpt;     double cost;     Edge(int _dest, int _flow, double _cost, int _ctpt)         : dest(_dest), flow(_flow), cost(_cost), ctpt(_ctpt) {}   };   vector<Edge> edges[2004];   int source = 2002, sink = 2003, from[2004];   double dist[2004], p[2000], u[2000];   bool inq[2004];   vector<Edge>::iterator edge_from[2004];   inline void insert(int from, int to, int flow, double cost) {     edges[from].push_back(Edge(to, flow, cost, edges[to].size()));     edges[to].push_back(Edge(from, 0, -cost, edges[from].size() - 1));   }   inline bool can_augment() {     static queue<int> q;     vector<Edge>::iterator it;     int x;     memset(dist, 0xf0, sizeof dist);     dist[source] = 0.0;     inq[source] = true;     q.push(source);     while (!q.empty()) {       inq[x = q.front()] = false;       q.pop();       for (it = edges[x].begin(); it != edges[x].end(); ++it)         if (it->flow && dist[it->dest] < dist[x] + it->cost - eps) {           dist[it->dest] = dist[x] + it->cost;           from[it->dest] = x;           edge_from[it->dest] = it;           if (!inq[it->dest]) {             inq[it->dest] = true;             q.push(it->dest);           }         }     }     return dist[sink] > -1e60;   }   double augment() {     int i, flow = 0x3f3f3f3f;     double cost = 0.0;     for (i = sink; i != source; i = from[i]) flow = min(flow, edge_from[i]->flow);     for (i = sink; i != source; i = from[i]) {       cost += edge_from[i]->cost;       edge_from[i]->flow -= flow;       edges[i][edge_from[i]->ctpt].flow += flow;     }     return flow * cost;   }   int main() {     int n, a, b, i, A = 2000, B = 2001;     double ans = 0.0;     ios_base::sync_with_stdio(false);     cin >> n >> a >> b;     for (i = 0; i < n; ++i) cin >> p[i];     for (i = 0; i < n; ++i) cin >> u[i];     for (i = 0; i < n; ++i) {       insert(A, i, 1, p[i]);       insert(B, i, 1, u[i]);       insert(i, sink, 1, 0.0);       insert(i, sink, 1, -p[i] * u[i]);     }     insert(source, A, a, 0.0);     insert(source, B, b, 0.0);     while (can_augment()) ans += augment();     cout << fixed << ans <<   n ;     return 0;   }   