#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000010;
const double INF = 1e10;
int n;
int cmp(double x) {
  if (abs(x) < 1e-10) return 0;
  if (x > 0) return 1;
  return -1;
}
double sqr(double a) { return a * a; }
struct Point {
  double x, y;
  inline Point operator-(const Point &t) {
    Point ret;
    ret.x = x - t.x;
    ret.y = y - t.y;
    return ret;
  }
  inline Point operator+(const Point &t) {
    Point ret;
    ret.x = x + t.x;
    ret.y = y + t.y;
    return ret;
  }
  inline double det(const Point &t) { return x * t.y - t.x * y; }
  inline double dist(Point &t) { return sqrt(sqr(x - t.x) + sqr(y - t.y)); }
} d[MAXN], D;
bool cm(const Point &a, const Point &b) {
  double ka = (a.x == 0 ? INF : (double)a.y / a.x);
  double kb = (b.x == 0 ? INF : (double)b.y / b.x);
  return ka < kb;
}
int convex[MAXN], cTotal;
void get_convex_hull() {
  sort(d, d + n, cm);
  int Total = 0, tmp;
  for (int i = 0; i < n; ++i) {
    while ((Total > 1) && ((d[convex[Total - 1]] - d[convex[Total - 2]])
                               .det(d[i] - d[convex[Total - 1]]) <= 0))
      Total--;
    convex[Total++] = i;
  }
  cTotal = Total;
}
int main() {
  scanf("%d%lf%lf", &n, &D.x, &D.y);
  double xmax = 0, ymax = 0;
  for (int i = 0; i < n; i++) {
    scanf("%lf%lf", &d[i].x, &d[i].y);
    xmax = max(d[i].x, xmax);
    ymax = max(d[i].y, ymax);
  }
  d[n].x = xmax;
  d[n].y = 0;
  d[n + 1].x = 0;
  d[n + 1].y = ymax;
  n += 2;
  get_convex_hull();
  double k = D.y / D.x;
  int pos;
  double mk;
  for (pos = 1; pos < cTotal; pos++) {
    if (d[convex[pos]].y / d[convex[pos]].x > k) break;
  }
  if (pos == cTotal) pos--;
  double l = 0, r = 1000010;
  Point K;
  while (l <= r) {
    double mid = (l + r) / 2;
    K.x = D.x / mid;
    K.y = D.y / mid;
    double dot = (K - d[convex[pos - 1]]).det(d[convex[pos]] - K);
    if (cmp(dot) < 0)
      r = mid;
    else if (cmp(mid - l) == 0 && cmp(mid - r) == 0) {
      printf("%.10lf", mid);
      break;
    } else
      l = mid;
  }
}
