#include <bits/stdc++.h>
using namespace std;
inline long long myInt() {
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  int flag = 1;
  if (c == '-') flag = -1, c = getchar();
  long long x = 0;
  while (isdigit(c)) {
    x = (x * 10) + (c - '0');
    c = getchar();
  }
  if (-1 == flag) return -x;
  return x;
}
const long long INF = 1e15;
const int N = 100005;
struct point {
  double x, y;
  point() {}
  point(double _x, double _y) {
    x = _x;
    y = _y;
  }
  point operator+(point a) { return point(x + a.x, y + a.y); }
  point operator-(point a) { return point(x - a.x, y - a.y); }
  double operator*(point a) { return x * a.y - y * a.x; }
  double operator^(point a) { return x * a.x + y * a.y; }
  point operator*(double t) { return point(x * t, y * t); }
  point operator/(double t) { return point(x / t, y / t); }
  point verlLeft() { return point(-y, x); }
  point verlRight() { return point(y, -x); }
  void read() { scanf("%lf %lf", &x, &y); }
};
int n;
point p[N], Q[N];
int cmp(point a, point b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
point crossPoint(point a, point b, point p, point q) {
  double s1 = (p - a) * (q - a);
  double s2 = (q - b) * (p - b);
  return (a * (s2) + b * (s1)) / (s1 + s2);
}
int main() {
  n = myInt();
  double p0, q0;
  scanf("%lf%lf", &p0, &q0);
  for (int i = 1; i <= n; i++) p[i].read();
  sort(p + 1, p + n + 1, cmp);
  int top = 1;
  Q[1] = point(0, 0);
  for (int i = 1; i <= n; i++) {
    while (top >= 2 && (Q[top] - Q[top - 1]) * (p[i] - Q[top - 1]) >= 0) --top;
    Q[++top] = p[i];
  }
  double M = max(p0, q0);
  for (int i = 1; i <= n; i++) M = min(M, max(p0 / p[i].x, q0 / p[i].y));
  point up = point(p0, q0);
  point aa = point(0, 0), bb = up;
  for (int i = 2; i <= top; i++) {
    if ((Q[i] * up) >= 0 && (Q[i - 1] * up) <= 0) {
      point t = crossPoint(Q[i - 1], Q[i], aa, bb);
      M = min(M, p0 / t.x);
    }
  }
  printf("%.12f\n", M);
}
