#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:102400000,102400000")
template <class T>
inline void gmax(T &a, T b) {
  if (b > a) a = b;
}
template <class T>
inline void gmin(T &a, T b) {
  if (b < a) a = b;
}
using namespace std;
const int N = 2e5 + 10, M = 2e6 + 10, Z = 1e9 + 7, maxint = 2147483647,
          ms1 = 16843009, ms31 = 522133279, ms63 = 1061109567,
          ms127 = 2139062143;
const long double PI = acos(-1.0), eps = 1e-8;
void fre() {
  freopen("/Users/luras/Desktop/in.txt", "r", stdin);
  freopen("/Users/luras/Desktop/out.txt", "w", stdout);
}
const int INF = 1e9;
int casenum, casei;
int n;
long double p, q;
int cmp(long double x) {
  if (fabs(x) < eps) return 0;
  if (x > 0) return 1;
  return -1;
}
struct point {
  long double x, y;
  point() {}
  point(long double a, long double b) : x(a), y(b) {}
  friend bool operator==(const point &a, const point &b) {
    return cmp(a.x - b.x) == 0 && cmp(a.y - b.y) == 0;
  }
  friend point operator-(const point &a, const point &b) {
    return point(a.x - b.x, a.y - b.y);
  }
  friend point operator*(const long double &a, const point &b) {
    return point(a * b.x, a * b.y);
  }
  friend point operator*(const point &a, const long double &b) {
    return point(a.x * b, a.y * b);
  }
  friend point operator/(const point &a, const long double &b) {
    return point(a.x / b, a.y / b);
  }
};
long double det(const point &a, const point &b) {
  return a.x * b.y - a.y * b.x;
}
long double dot(const point &a, const point &b) {
  return a.x * b.x + a.y * b.y;
}
struct line {
  point a, b;
  line() {}
  line(point x, point y) : a(x), b(y) {}
};
bool parallel(line a, line b) { return !cmp(det(a.a - a.b, b.a - b.b)); }
bool line_make_point(line a, line b, point &res) {
  if (parallel(a, b)) return false;
  long double s1 = det(a.a - b.a, b.b - b.a);
  long double s2 = det(a.b - b.a, b.b - b.a);
  res = (s1 * a.b - s2 * a.a) / (s1 - s2);
  return true;
}
bool PointOnSegment(point p, point s, point t) {
  return cmp(det(p - s, t - s)) == 0 && cmp(dot(p - s, p - t)) <= 0;
}
struct polygon_convex {
  vector<point> P;
  polygon_convex(int Size = 0) { P.resize(Size); }
};
bool comp_less(const point &a, const point &b) {
  return cmp(a.x - b.x) < 0 || cmp(a.x - b.x) == 0 && cmp(a.y - b.y) < 0;
}
polygon_convex convex_hull(vector<point> a) {
  polygon_convex res(2 * a.size() + 5);
  sort(a.begin(), a.end(), comp_less);
  a.erase(unique(a.begin(), a.end()), a.end());
  int m = 0;
  for (int i = 0; i < a.size(); i++) {
    while (m > 1 &&
           cmp(det(res.P[m - 1] - res.P[m - 2], a[i] - res.P[m - 2])) <= 0)
      --m;
    res.P[m++] = a[i];
  }
  int k = m;
  for (int i = int(a.size()) - 2; i >= 0; i--) {
    while (m > k &&
           cmp(det(res.P[m - 1] - res.P[m - 2], a[i] - res.P[m - 2])) <= 0)
      --m;
    res.P[m++] = a[i];
  }
  res.P.resize(m);
  if (a.size() > 1) res.P.resize(m - 1);
  return res;
}
int main() {
  while (~scanf("%d", &n)) {
    cin >> p >> q;
    polygon_convex a;
    point t;
    for (int i = 1; i <= n; i++) {
      cin >> t.x >> t.y;
      a.P.push_back(t);
    }
    t.x = 0, t.y = 0;
    a.P.push_back(t);
    a = convex_hull(a.P);
    point p1, res;
    p1.x = p, p1.y = q;
    long double ans = INF;
    for (int i = 1; i < a.P.size() - 1; i++) {
      line L1 = line(p1, t);
      line L2 = line(a.P[i], a.P[i + 1]);
      if (line_make_point(L1, L2, res) &&
          PointOnSegment(res, a.P[i], a.P[i + 1])) {
        gmin(ans, p1.x / res.x);
      }
    }
    for (int i = 1; i < a.P.size(); i++) {
      gmin(ans, max(p / a.P[i].x, q / a.P[i].y));
    }
    cout << setprecision(15) << ans << endl;
  }
  return 0;
}
