Files
SH-Quizzes/ACMOJ-2165.cpp
2024-04-18 18:38:55 +08:00

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