#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
inline void smax(T1 &a, T2 b) {
  if (a < b) a = b;
}
template <class T1, class T2>
inline void smin(T1 &a, T2 b) {
  if (a > b) a = b;
}
complex<double> ab;
int n, p, q;
complex<double> points[100100];
double PI = acos(-1);
double EPS = 1e-9;
complex<double> normal(complex<double> pt) { return pt / abs(pt); }
double cross(complex<double> a, complex<double> b) { return imag(conj(a) * b); }
int cmp(double a, double b) {
  if (a > b + EPS) return +1;
  if (a + EPS < b) return -1;
  return 0;
}
bool compareFunction(const complex<double> &a, const complex<double> &b) {
  if (a.real() != b.real()) return a.real() < b.real();
  return a.imag() < b.imag();
}
vector<complex<double> > getConvexHull() {
  vector<int> upper;
  vector<int> lower;
  sort(points, points + n, compareFunction);
  upper.push_back(0);
  for (int i = 1; i < n; ++i) {
    int size = ((int)(upper).size());
    while (size >= 2 &&
           cmp(cross(points[i] - points[upper[size - 1]],
                     points[upper[size - 2]] - points[upper[size - 1]]),
               0) >= 0) {
      upper.pop_back();
      size--;
    }
    upper.push_back(i);
  }
  lower.push_back(0);
  for (int i = 1; i < n; ++i) {
    int size = ((int)(lower).size());
    while (size >= 2 &&
           cmp(cross(points[i] - points[lower[size - 1]],
                     points[lower[size - 2]] - points[lower[size - 1]]),
               0) <= 0) {
      lower.pop_back();
      size--;
    }
    lower.push_back(i);
  }
  vector<complex<double> > convex;
  for (int i = 0; i < ((int)(upper).size()); ++i)
    convex.push_back(points[upper[i]]);
  for (int i = 1; i < ((int)(lower).size()) - 1; ++i)
    convex.push_back(points[lower[i]]);
  return convex;
}
int intersect(complex<double> p1, complex<double> p2, complex<double> p3,
              complex<double> p4, complex<double> &inter) {
  double d = cross(p2 - p1, p4 - p3);
  if (cmp(d, 0) == 0) return -1;
  double u = cross(p4 - p3, p1 - p3);
  u /= d;
  inter = p1 + (p2 - p1) * u;
  return 0;
}
int getIntersect(complex<double> p1, complex<double> p2,
                 complex<double> &inter) {
  int ret = intersect(p1, p2, complex<double>(0, 0), ab, inter);
  if (ret == -1) return 0;
  if (cmp(abs(p1 - inter) + abs(p2 - inter), abs(p1 - p2)) == 0) return +1;
  return 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> p >> q;
  for (int i = 0; i < n; ++i) {
    int x, y;
    cin >> x >> y;
    points[i] = complex<double>(x, y);
  }
  ab = complex<double>(p, q);
  double ans = 1e20;
  for (int i = 0; i < n; ++i) {
    smin(ans, max(ab.real() / points[i].real(), ab.imag() / points[i].imag()));
  }
  vector<complex<double> > convex = getConvexHull();
  complex<double> inter;
  int found = 0;
  for (int i = 0; i < ((int)(convex).size()); ++i) {
    complex<double> p1;
    int num =
        getIntersect(convex[i], convex[(i + 1) % ((int)(convex).size())], p1);
    if (num == 1) {
      if (found == 0)
        inter = p1;
      else if (abs(p1) > abs(inter))
        inter = p1;
      found++;
    }
  }
  if (found) smin(ans, abs(ab) / abs(inter));
  cout << fixed << setprecision(10) << ans << endl;
  return 0;
}
