59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
#include <algorithm>
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#include <iostream>
|
|
using namespace std;
|
|
typedef long long LL;
|
|
typedef long double LDB;
|
|
const int kMaxN = 1e4 + 10;
|
|
const LDB kEps = 1e-4;
|
|
int n, a, b;
|
|
LDB p[kMaxN], q[kMaxN];
|
|
LDB calcxy(LDB x, LDB y) {
|
|
LDB tot = a * x + b * y;
|
|
for (int i = 1; i <= n; i++)
|
|
tot += max({LDB(0), p[i] - x, q[i] - y, p[i] + q[i] - p[i] * q[i] - x - y});
|
|
return tot;
|
|
}
|
|
LDB calcx(LDB x) {
|
|
LDB res=0;
|
|
LDB left_bound = -1e4, right_bound = 1e4;
|
|
while (right_bound - left_bound > kEps) {
|
|
LDB l_mid = (left_bound + left_bound + right_bound) / 3;
|
|
LDB r_mid = (left_bound + right_bound + right_bound) / 3;
|
|
LDB l_res = calcxy(x, l_mid);
|
|
LDB r_res = calcxy(x, r_mid);
|
|
res = (l_res + r_res) / 2;
|
|
if (l_res > r_res)
|
|
left_bound = l_mid;
|
|
else
|
|
right_bound = r_mid;
|
|
}
|
|
return res;
|
|
}
|
|
LDB calc() {
|
|
LDB res = 0;
|
|
LDB left_bound = -1e4, right_bound = 1e4;
|
|
while (right_bound - left_bound > kEps) {
|
|
LDB l_mid = (left_bound + left_bound + right_bound) / 3;
|
|
LDB r_mid = (left_bound + right_bound + right_bound) / 3;
|
|
LDB l_res = calcx(l_mid);
|
|
LDB r_res = calcx(r_mid);
|
|
res = (l_res + r_res) / 2;
|
|
if (l_res > r_res)
|
|
left_bound = l_mid;
|
|
else
|
|
right_bound = r_mid;
|
|
}
|
|
return res;
|
|
}
|
|
int main() {
|
|
#ifdef local
|
|
freopen("pro.in", "r", stdin);
|
|
#endif
|
|
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", &q[i]);
|
|
printf("%.2Lf\n", calc());
|
|
return 0;
|
|
} |