#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-9;
const double PI = 3.141592653589793;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
struct Pt {
  double x, y;
  Pt(double a = 0, double b = 0) : x(a), y(b) {}
  bool operator==(const Pt& p) const { return p.x == x && p.y == y; }
  bool operator<(const Pt& p) const { return x == p.x ? y > p.y : x < p.x; }
  Pt operator-(const Pt& p) const { return {x - p.x, y - p.y}; }
  Pt operator+(const Pt& p) const { return {x + p.x, y + p.y}; }
  Pt operator/(const double c) const { return {x / c, y / c}; }
  Pt operator*(const double c) const { return {x * c, y * c}; }
  Pt vetor(const Pt& o) const { return o - (*this); }
  double dot(const Pt& b) const { return (x * b.x) + (y * b.y); }
  double sq() const { return (x * x) + (y * y); }
  double dist(const Pt& b) { return sqrt((b - *this).sq()); }
  double cross(const Pt& b) const { return (x * b.y) - (y * b.x); }
  double cross(const Pt& a, const Pt& b) const {
    return (a - *this).cross(b - *this);
  }
  double angle(Pt& a, Pt& b) const {
    a = vetor(a), b = vetor(b);
    return acos(1.0 * a.dot(b) / sqrt(1.0 * a.dot(a) * b.dot(b)));
  }
} pts[101000];
Pt obj;
Pt perp(Pt p) { return {-p.y, p.x}; }
ostream& operator<<(ostream& os, Pt p) {
  return os << "(" << p.x << "," << p.y << ")";
}
template <typename F>
int sgn(F x) {
  return (F(0) < x) - (x < F(0));
}
struct Line {
  double A, B, C;
  Line() {}
  Line(const Pt& de, const Pt& pa) {
    A = de.y - pa.y;
    B = pa.x - de.x;
    C = -A * de.x - B * de.y;
  }
};
bool mORe(double a, double b) { return a <= b || fabs(a - b) <= EPS; }
struct Seg {
  Pt A, B;
  Seg() {}
  Seg(Pt a, Pt b) : A(a), B(b) {
    if (B < A) swap(A, B);
  }
  bool inDouble(const Pt& Pt) {
    return mORe(min(A.x, B.x), Pt.x) && mORe(Pt.x, max(A.x, B.x)) &&
           mORe(min(A.y, B.y), Pt.y) && mORe(Pt.y, max(A.y, B.y));
  }
  bool inter(Seg& o, Pt& res) {
    Line l1 = Line(A, B), l2 = Line(o.A, o.B);
    double dx = Pt(l1.C, l1.B).cross(Pt(l2.C, l2.B));
    double dy = Pt(l1.A, l1.C).cross(Pt(l2.A, l2.C));
    double d = Pt(l1.A, l1.B).cross(Pt(l2.A, l2.B));
    if (d == 0) return false;
    res = Pt(-dx / d, -dy / d);
    if (!inDouble(res) || !o.inDouble(res)) return false;
    return true;
  }
};
int n, p, q;
void solve() {
  vector<Pt> chain;
  int sz = 0;
  for (int i = 0; i < n; i++) {
    while (sz >= 2 && chain[sz - 2].cross(chain[sz - 1], pts[i]) >= 0)
      chain.pop_back(), sz--;
    chain.emplace_back(pts[i]);
    sz++;
  }
  vector<Seg> linhas;
  for (int i = 1; i < chain.size(); i++) {
    linhas.emplace_back(chain[i - 1], chain[i]);
  }
  Seg teste = {Pt(0, 0), obj * 1000002.0};
  for (Seg linha : linhas) {
    Pt res;
    if (linha.inter(teste, res)) {
      printf("%.12f\n", max(obj.x / res.x, obj.y / res.y));
      return;
    }
  }
}
int main() {
  scanf("%d%d%d", &n, &p, &q);
  obj = {(double)p, (double)q};
  int x, y;
  int maxx = 0, maxy = 0;
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &x, &y);
    pts[i] = {(double)x, (double)y};
    maxx = max(maxx, x);
    maxy = max(maxy, y);
  }
  pts[n] = {0.0, (double)maxy};
  pts[n + 1] = {(double)maxx, 0.0};
  n += 2;
  sort(pts, pts + n);
  solve();
  return 0;
}
