#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
  void scan() { scanf("%lf%lf", &x, &y); }
} A[110000];
double cross(point k1, point k2) { return k1.x * k2.y - k1.y * k2.x; }
point operator-(point k1, point k2) {
  return (point){k1.x - k2.x, k1.y - k2.y};
}
int n, p, q, s[110000], head;
int compare(point k1, point k2) {
  return k1.x < k2.x || (k1.x == k2.x && k1.y < k2.y);
}
double get(int k1, int k2) {
  double a = A[k2].x * A[k1].y - A[k1].x * A[k2].y,
         c = p * A[k1].y - q * A[k1].x;
  if (fabs(a) < 1e-10) return 1e20;
  double y = c / a, z = (p - A[k2].x * y) / A[k1].x;
  if (y < 0 || z < 0) return 1e20;
  return y + z;
}
int main() {
  scanf("%d%d%d", &n, &p, &q);
  for (int i = 1; i <= n; i++) A[i].scan();
  sort(A + 1, A + n + 1, compare);
  int head = 1;
  s[1] = 1;
  for (int i = 2; i <= n; i++) {
    while (head > 1 &&
           cross(A[i] - A[s[head]], A[s[head]] - A[s[head - 1]]) <= 0)
      head--;
    s[++head] = i;
  }
  double ans = 1e20;
  for (int i = 1; i <= head; i++) {
    ans = min(ans, max(p / A[s[i]].x, q / A[s[i]].y));
    if (i != head) ans = min(ans, get(s[i], s[i + 1]));
  }
  printf("%.11lf\n", ans);
  return 0;
}
