#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const double pi = acos(-1);
const int maxn = 1e5 + 500;
int dcmp(double p) {
  if (fabs(p) < eps)
    return 0;
  else
    return p < 0 ? -1 : 1;
}
inline double Deg2Rad(const double& p) { return pi * p / 180.0; }
inline double Rad2Deg(const double& p) { return p * 180.0 / pi; }
struct Point {
  double x, y;
  Point(double x = 0., double y = 0.) { this->x = x, this->y = y; }
  friend Point operator+(const Point& T1, const Point& T2) {
    return Point(T1.x + T2.x, T1.y + T2.y);
  }
  friend Point operator-(const Point& T1, const Point& T2) {
    return Point(T1.x - T2.x, T1.y - T2.y);
  }
  friend Point operator*(const Point& T1, const double p) {
    return Point(T1.x * p, T1.y * p);
  }
  friend Point operator*(const Point& T1, const int p) {
    return Point(T1.x * p, T1.y * p);
  }
  friend bool operator==(const Point& T1, const Point& T2) {
    return dcmp(T1.x - T2.x) == 0 && dcmp(T1.y - T2.y) == 0;
  }
  friend ostream& operator<<(ostream& os, const Point& x) {
    os << "x is " << x.x << " y is " << x.y;
    return os;
  }
};
Point temp[maxn];
double Dot(const Point& T1, const Point& T2) {
  return T1.x * T2.x + T1.y * T2.y;
}
double Length(const Point& T1) { return sqrt(Dot(T1, T1)); }
double Angle(const Point& T1, const Point& T2) {
  return acos(Dot(T1, T2) / Length(T1) / Length(T2));
}
double Cross(const Point& T1, const Point& T2) {
  return T1.x * T2.y - T2.x * T1.y;
}
double Area2(const Point& T1, const Point& T2, const Point& T3) {
  return Cross(T3 - T1, T2 - T1);
}
Point Rotate(const Point& T1, const double rad) {
  return Point(T1.x * cos(rad) - T1.y * sin(rad),
               T1.x * sin(rad) + T1.y * cos(rad));
}
Point Normal(const Point& T1) {
  double L = Length(T1);
  return Point(T1.x / L, T1.y / L);
}
bool cmp1(const Point& a, const Point& b) {
  return a.x < b.x || (dcmp(a.x - b.x) == 0 && a.y < b.y);
}
bool cmp2(const Point& a, const Point& b) {
  double t1 = atan2(a.y, a.x);
  double t2 = atan2(b.y, b.x);
  if (t1 < 0) t1 += 360.0;
  if (t2 < 0) t2 += 360.0;
  return t1 < t2;
}
double DistanceToLine(const Point& A, const Point& u, const Point& v) {
  Point v1(A - u), v2(v - u);
  return fabs(Cross(v1, v2)) / Length(v2);
}
double DistanceToSegment(const Point& A, const Point& u, const Point& v) {
  if (u == v) return Length(A - u);
  Point v1 = v - u, v2 = A - u, v3 = A - v;
  if (dcmp(Dot(v1, v2)) < 0)
    return Length(v2);
  else if (dcmp(Dot(v1, v3)) > 0)
    return Length(v3);
  else
    return fabs(Cross(v1, v2)) / Length(v1);
}
Point GetLineIntersection(const Point& a, const Point& va, const Point& b,
                          const Point& vb) {
  Point u = a - b;
  double t = Cross(vb, u) / Cross(va, vb);
  return a + va * t;
}
bool SegmentProperIntersection(const Point& a1, const Point& a2,
                               const Point& b1, const Point& b2) {
  double c1 = Cross(b2 - b1, a1 - b1), c2 = Cross(b2 - b1, a2 - b1),
         c3 = Cross(a2 - a1, b1 - a1), c4 = Cross(a2 - a1, b2 - a1);
  return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;
}
bool IsPointOnSegment(const Point& p, const Point& a1, const Point& a2) {
  return dcmp(Cross(a1 - p, a2 - p)) == 0 && Dot(a1 - p, a2 - p) < 0;
}
double ConvexPolygonArea(Point* Polygon, int n) {
  double area = 0;
  for (int i = 1; i < n - 1; ++i)
    area += Cross(Polygon[i] - Polygon[0], Polygon[i + 1] - Polygon[0]);
  return area / 2.0;
}
void reset(Point* c1, Point* c2, int n) {
  for (int i = 0; i < n; ++i) c1[i] = c2[i];
}
int PointInPolygon(const Point& p, Point* Polygon, const int n, double pp) {
  int wn = 0;
  for (int i = 0; i < n; ++i) {
    temp[i] = Polygon[i];
    Polygon[i].x *= pp, Polygon[i].y *= pp;
  }
  for (int i = 0; i < n; ++i) {
    int t1 = i;
    int t2 = (i + 1) >= n ? i + 1 - n : i + 1;
    if (IsPointOnSegment(p, Polygon[t1], Polygon[t2])) {
      reset(Polygon, temp, n);
      return -1;
    }
    int k = dcmp(Cross(Polygon[t2] - Polygon[t1], p - Polygon[t1]));
    int d1 = dcmp(Polygon[t1].y - p.y);
    int d2 = dcmp(Polygon[t2].y - p.y);
    if (k > 0 && d1 <= 0 && d2 > 0) wn++;
    if (k < 0 && d2 <= 0 && d1 > 0) wn--;
  }
  reset(Polygon, temp, n);
  if (wn != 0) return 1;
  return 0;
}
int ConvexHull(Point* p, int n, Point* ch) {
  sort(p, p + n, cmp1);
  int m = 0;
  for (int i = 0; i < n; ++i) {
    while (m > 1 && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0) m--;
    ch[m++] = p[i];
  }
  int k = m;
  for (int i = n - 2; i >= 0; --i) {
    while (m > k && Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2]) <= 0) m--;
    ch[m++] = p[i];
  }
  if (n > 1) m--;
  return m;
}
Point a[maxn], b[maxn], target;
int n, m, tot, maxx = 0, maxy = 0;
double pp, qq;
int main(int argc, char* argv[]) {
  scanf("%d%lf%lf", &n, &pp, &qq);
  a[tot].x = 0, a[tot++].y = 0;
  for (int i = 0; i < n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    a[tot].x = x, a[tot++].y = y;
    maxx = max(maxx, x);
    maxy = max(maxy, y);
  }
  target.x = pp, target.y = qq;
  a[tot].x = 0, a[tot++].y = maxy;
  a[tot].x = maxx, a[tot++].y = 0;
  m = ConvexHull(a, tot, b);
  double l = 0, r = 1e7;
  for (int step = 1; step <= 100; ++step) {
    double mid = (l + r) / 2.0;
    int res = PointInPolygon(target, b, m, mid);
    if (res == 1)
      r = mid;
    else
      l = mid;
  }
  printf("%.10lf\n", l);
  return 0;
}
