#include <bits/stdc++.h>
using namespace std;
const int MAXN = (int)1e5 + 7;
const int INF = (int)1e9 + 7;
const long long LINF = (long long)1e18 + 7;
const int MOD = (int)1e9 + 7;
void file() {}
inline int readChar();
template <class T = int>
inline T readInt();
template <class T>
inline void writeInt(T x, char end = 0);
inline void writeChar(int x);
inline void writeWord(const char *s);
static const int buf_size = 4096;
inline int getChar() {
  static char buf[buf_size];
  static int len = 0, pos = 0;
  if (pos == len) pos = 0, len = fread(buf, 1, buf_size, stdin);
  if (pos == len) return -1;
  return buf[pos++];
}
inline int readChar() {
  int c = getChar();
  while (c <= 32) c = getChar();
  return c;
}
template <class T>
inline T readInt() {
  int s = 1, c = readChar();
  T x = 0;
  if (c == '-') s = -1, c = getChar();
  while ('0' <= c && c <= '9') x = x * 10 + c - '0', c = getChar();
  return s == 1 ? x : -x;
}
static int write_pos = 0;
static char write_buf[buf_size];
inline void writeChar(int x) {
  if (write_pos == buf_size)
    fwrite(write_buf, 1, buf_size, stdout), write_pos = 0;
  write_buf[write_pos++] = x;
}
template <class T>
inline void writeInt(T x, char end) {
  if (x < 0) writeChar('-'), x = -x;
  char s[24];
  int n = 0;
  while (x || !n) s[n++] = '0' + x % 10, x /= 10;
  while (n--) writeChar(s[n]);
  if (end) writeChar(end);
}
inline void writeWord(const char *s) {
  while (*s) writeChar(*s++);
}
struct Flusher {
  ~Flusher() {
    if (write_pos) fwrite(write_buf, 1, write_pos, stdout), write_pos = 0;
  }
} flusher;
struct Point {
  int x, y;
  Point() {}
  Point(int _x, int _y) { x = _x, y = _y; }
};
struct Vect {
  int x, y;
  Vect() {}
  Vect(int _x, int _y) { x = _x, y = _y; }
  Vect(Point a) { x = a.x, y = a.y; }
  Vect(Point a, Point b) { x = b.x - a.x, y = b.y - a.y; }
  long long operator^(Vect d) { return 1ll * x * d.y - 1ll * y * d.x; }
};
const int MAX_MEM = 2e8;
int mpos = 0;
char mem[MAX_MEM];
inline void *operator new(size_t n) {
  char *res = mem + mpos;
  mpos += n;
  assert(mpos <= MAX_MEM);
  return (void *)res;
}
inline void operator delete(void *) {}
int main() {
  file();
  int n;
  Point C;
  n = readInt(), C.x = readInt(), C.y = readInt();
  vector<Point> A(n), B;
  for (int i = 0; i < n; ++i) {
    A[i].x = readInt(), A[i].y = readInt();
  }
  sort(A.begin(), A.end(), [](Point a, Point b) {
    return make_pair(a.x, a.y) > make_pair(b.x, b.y);
  });
  int maxy = -1;
  for (Point i : A) {
    if (i.y > maxy) {
      B.push_back(i);
      maxy = i.y;
    }
  }
  if ((Vect(B[0]) ^ Vect(B[0], C)) <= 0) {
    printf("%.10f", max(1.0 * C.x / B[0].x, 1.0 * C.y / B[0].y));
    return 0;
  }
  if ((int)B.size() == 1 || (Vect(B.back()) ^ Vect(B.back(), C)) >= 0) {
    printf("%.10f", max(1.0 * C.x / B.back().x, 1.0 * C.y / B.back().y));
    return 0;
  }
  int ind;
  for (int i = 0; i < (int)B.size() - 1; ++i) {
    if ((Vect(B[i]) ^ Vect(B[i], C)) >= 0) {
      ind = i;
    } else {
      break;
    }
  }
  double ans = 1e18;
  for (int i = ind; i >= 0; --i) {
    if (clock() * 1.0 / CLOCKS_PER_SEC > 1.995) {
      break;
    }
    int x1, x2, y1, y2;
    x1 = B[i].x, y1 = B[i].y;
    int l = (int)B.size() - 1, r = ind + 1;
    long long sss = (1ll * x1 * C.y - 1ll * C.x * y1);
    while (r - l > 1) {
      int tl = (r + l) / 2;
      int tr = tl + 1;
      double ans1;
      x2 = B[tl].x, y2 = B[tl].y;
      double a, b;
      if (x1 * y2 - x2 * y1 == 0) {
        int yy = max(y1, y2);
        int xx = max(x1, x2);
        ans1 = 1.0 * C.x / xx + 1.0 * C.y / yy;
      } else {
        b = 1.0 * sss / (1ll * x1 * y2 - 1ll * x2 * y1);
        a = 1.0 * (C.x - b * x2) / x1;
        ans1 = a + b;
      }
      double ans2;
      x2 = B[tr].x, y2 = B[tr].y;
      if (x1 * y2 - x2 * y1 == 0) {
        int yy = max(y1, y2);
        int xx = max(x1, x2);
        ans2 = 1.0 * C.x / xx + 1.0 * C.y / yy;
      } else {
        b = 1.0 * sss / (1ll * x1 * y2 - 1ll * x2 * y1);
        a = 1.0 * (C.x - b * x2) / x1;
        ans2 = a + b;
      }
      if (ans1 >= ans2) {
        l = tl;
      } else {
        r = tr;
      }
    }
    double cur = 1e18;
    for (int j = r; j <= l; ++j) {
      double ans1;
      x2 = B[j].x, y2 = B[j].y;
      double a, b;
      if (x1 * y2 - x2 * y1 == 0) {
        int yy = max(y1, y2);
        int xx = max(x1, x2);
        ans1 = 1.0 * C.x / xx + 1.0 * C.y / yy;
      } else {
        b = 1.0 * sss / (1ll * x1 * y2 - 1ll * x2 * y1);
        a = 1.0 * (C.x - b * x2) / x1;
        ans1 = a + b;
      }
      cur = min(cur, ans1);
    }
    ans = min(ans, cur);
  }
  printf("%.10f", ans);
  return 0;
}
