#include <bits/stdc++.h>
using namespace std;
long long int n, c, pointer;
long long int x[1000004];
long long int d[1000004];
vector<long double> M1;
struct point {
  long double x, y;
  point() { x = y = 0; }
  point(long double a, long double b) {
    x = a;
    y = b;
  }
};
struct line {
  long long int a, b;
  line() { a = b = 0; }
  line(long long int u, long long int v) {
    a = u;
    b = v;
  }
};
line l[1000005];
vector<line> M;
point line_intersection(line l1, line l2) {
  long double x = (long double)(l1.b - l2.b) / 1.0 / (l2.a - l1.a);
  return point(x, l1.a * x + l1.b);
}
bool operator<(line a, line b) {
  if (a.a != b.a)
    return a.a < b.a;
  else
    return a.b < b.b;
}
bool isBad(line l1, line l2, line l3) {
  return (line_intersection(l1, l3).x < line_intersection(l1, l2).x ||
          abs(line_intersection(l1, l3).x - line_intersection(l1, l2).x) <
              (1e-8));
}
void add(line i) {
  M.push_back(i);
  if (M.size() >= 2) {
    if (M[(int)M.size() - 2].a == M[(int)M.size() - 1].a) {
      M.erase(M.end() - 2);
      if (M1.size()) M1.pop_back();
    }
  }
  while ((int)M.size() >= 3 && isBad(M[(int)M.size() - 3], M[(int)M.size() - 2],
                                     M[(int)M.size() - 1])) {
    M.erase(M.end() - 2);
    M1.pop_back();
  }
  if ((int)M.size() > 1)
    M1.push_back(
        line_intersection(M[(int)M.size() - 1], M[(int)M.size() - 2]).x);
}
long double query(long double x) {
  long long int u = (int)M.size();
  if (M.size() == 1) return M[0].a * x + M[0].b;
  if (x < M1[0]) return (M[0].a * x + M[0].b);
  long long int dau = 0, cuoi = (int)M1.size() - 1, mid;
  while (dau < cuoi) {
    mid = (dau + cuoi + 1) / 2;
    if (x < M1[mid])
      cuoi = mid - 1;
    else
      dau = mid;
  }
  return (long double)M[dau + 1].a * x + M[dau + 1].b;
}
long long int p, q;
inline long double calc(long double m) {
  long double r = query(m);
  return (long double)(p + m * q) / r;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(NULL);
  long long int n;
  long double res = 0;
  cin >> n >> p >> q;
  for (int i = 1; i <= n; i++) {
    cin >> l[i].b >> l[i].a;
    res = max(res, (long double)l[i].a);
  }
  sort(l + 1, l + n + 1);
  for (int i = 1; i <= n; i++) add(l[i]);
  long double res1 = q * 1.0 / res;
  long double L = 0, R = 1e9, ML, MR;
  while (abs(L - R) > 1e-8) {
    ML = (2 * L + R) / 3;
    MR = (2 * R + L) / 3;
    if (calc(ML) > calc(MR))
      R = MR;
    else
      L = ML;
  }
  cout << fixed << setprecision(8) << max(calc(L), res1) << endl;
  return 0;
}
