#include <bits/stdc++.h>
using namespace std;
const int maxn = 100100;
int s[maxn];
struct Point {
  int x, y;
  Point() {}
  Point(int _x, int _y) {
    x = _x;
    y = _y;
  }
  Point operator-(const Point& b) const { return Point(x - b.x, y - b.y); }
  long long operator*(const Point& b) const {
    return (long long)x * b.y - (long long)y * b.x;
  }
} p[maxn];
int top;
void Graham(int n) {
  top = 0;
  for (int i = 0; i < n; i++) {
    while (top && p[i].y >= p[s[top]].y) --top;
    while (top >= 2 &&
           (p[i] - p[s[top - 1]]) * (p[s[top]] - p[s[top - 1]]) <= 0)
      --top;
    s[++top] = i;
  }
}
bool cmp(Point a, Point b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
double x, y;
double solve(double mid, Point a, Point b) {
  return max(x / (mid * a.x + (1 - mid) * b.x),
             y / (mid * a.y + (1 - mid) * b.y));
}
int main() {
  int n;
  while (scanf("%d%lf%lf", &n, &x, &y) != EOF) {
    for (int i = 0; i < n; i++) scanf("%d%d", &p[i].x, &p[i].y);
    sort(p, p + n, cmp);
    Graham(n);
    double ans = max(x / p[s[1]].x, y / p[s[1]].y);
    for (int i = 1; i < top; i++) {
      double low = 0, high = 1;
      for (int j = 0; j < 100; j++) {
        double m1 = low + (high - low) / 3;
        double m2 = high - (high - low) / 3;
        double ans1 = solve(m1, p[s[i]], p[s[i + 1]]);
        double ans2 = solve(m2, p[s[i]], p[s[i + 1]]);
        if (ans1 < ans2) {
          ans = min(ans1, ans);
          high = m2;
        } else {
          ans = min(ans2, ans);
          low = m1;
        }
      }
    }
    printf("%.12lf\n", ans);
  }
  return 0;
}
