using
namespace
std;
const
double eps=
1e-8;
const
int maxn=
2000+
5;
int n,a,b;
struct {
int to;
double cost;
int cap,rev;
edge(
int to=
0,
double cost=
0,
int cap=
0,
int rev=
0): to(to),cost(cost),cap(cap),rev(rev) {}
};
vector<edge> g[maxn];
void addedge(int from,int to,int cap,double cost)
{
cost=-cost;
g[from].push_back(edge(to,cost,cap,g[to].size()));
g[to].push_back(edge(from,-cost,
0,g[from].size()
-1));
}
double p[maxn],u[maxn];
int S,T,A,B;
#define MP make_pair
bool inque[maxn];
double dis[maxn];
int preve[maxn],prevv[maxn];
queue<
int > q;
double spfa()
{
for(
int i=S;i<=B;i++) dis[i]=
1e60,inque[i]=
false;
dis[S]=
0;inque[S]=
true;
while(!q.empty()) q.pop();
q.push(S);
memset(prevv,
0,
sizeof(prevv));
memset(preve,
0,
sizeof(preve));
while(!q.empty())
{
int u=q.front();q.pop();inque[u]=
false;
for(
int i=
0;i<(
int)g[u].size();i++){
edge &e=g[u][i];
if(e.cap && dis[e.to]-(dis[u]+e.cost)>eps) {
dis[e.to]=dis[u]+e.cost;
preve[e.to]=i,prevv[e.to]=u;
if(!inque[e.to]){
inque[e.to]=
true;
q.push(e.to);
}
}
}
}
if(dis[T]>=
1e60)
return
0;
int gap=INT_MAX;
for(
int i=T;i!=S;i=prevv[i]) gap=min(gap,g[prevv[i]][preve[i]].cap);
for(
int i=T;i!=S;i=prevv[i]){
edge &e=g[prevv[i]][preve[i]];
e.cap-=gap;
g[i][e.rev].cap+=gap;
}
return dis[T]*(
double)gap;
}
double MaxcostMaxflow()
{
double res=
0,ret=
0;
while((res=spfa())!=
0) ret+=res,res=
0;
return ret;
}
int main()
{
scanf(
"%d%d%d",&n,&a,&b);
for(
int i=
1;i<=n;i++)
scanf(
"%lf",&p[i]);
for(
int i=
1;i<=n;i++)
scanf(
"%lf",&u[i]);
S=
0,T=n+
1,A=n+
2,B=n+
3;
addedge(S,A,a,
0),addedge(S,B,b,
0);
for(
int i=
1;i<=n;i++) addedge(A,i,
1,p[i]),addedge(B,i,
1,u[i]),addedge(i,T,
1,
0),addedge(i,T,
1,-p[i]*u[i]);
printf(
"%.4lfn",-MaxcostMaxflow());
return
0;
}
|