#include <bits/stdc++.h>
using namespace std;
long long nextInt() {
  long long x;
  scanf("%I64d", &x);
  return x;
}
string nextString() {
  char s[100];
  scanf("%s", s);
  return s;
}
struct Particle {
  double x0;
  double v0;
  int type;
  int id;
};
double t;
bool pLess(const Particle &a, const Particle &b) {
  double ax = a.x0 + a.v0 * t;
  double bx = b.x0 + b.v0 * t;
  return ax < bx;
}
bool idLess(const Particle &a, const Particle &b) { return a.id < b.id; }
void sortParts(Particle *p, int n, double curT) {
  t = curT;
  sort(p, p + n, pLess);
  int last = 0;
  for (int i = 0; i <= n; ++i) {
    if (i == n || p[i].type != p[last].type) {
      sort(p + last, p + i, idLess);
      last = i;
    }
  }
}
bool same(Particle *p1, Particle *p2, int n) {
  for (int i = 0; i < n; ++i) {
    if (p1[i].id != p2[i].id) {
      return false;
    }
  }
  return true;
}
const double inf = 1e10;
double getFirstIntersectionTime(Particle *begin, Particle *end) {
  double res = inf, dRes = 0.5 * res;
  while (dRes > 1e-12) {
    double maxX = -inf;
    double minX = inf;
    for (Particle *it = begin; it != end; ++it) {
      double curX = it->x0 + it->v0 * res;
      if (it->type == 1) {
        maxX = max(maxX, curX);
      } else {
        minX = min(minX, curX);
      }
    }
    if (maxX >= minX) {
      res -= dRes;
    } else {
      res += dRes;
    }
    dRes *= 0.5;
  }
  return res;
}
Particle p[501000];
Particle p2[501000];
int main() {
  if (false) {
    freopen("stdin.txt", "wt", stdout);
    int n = 500000;
    printf("%d\n", n);
    for (int i = 0; i < n; ++i) {
      printf("%d %d\n", -1000000000 + 2000000000 / n * i,
             (rand() % 100 + 1) * (rand() % 2 ? 1 : -1));
    }
    return 0;
  }
  int n = nextInt();
  for (int i = 0; i < n; ++i) {
    p[i].x0 = nextInt();
    p[i].v0 = nextInt();
    p[i].type = p[i].v0 < 0 ? -1 : 1;
    p[i].id = i;
  }
  vector<int> starts;
  int last = 0;
  for (int i = 0; i <= n; ++i) {
    if (i == n || p[i].type != p[last].type) {
      starts.push_back(last);
      last = i;
    }
  }
  double res = inf;
  for (int i = 1; i < starts.size(); ++i) {
    if (p[starts[i - 1]].type == 1) {
      int begin = starts[i - 1];
      int end = i + 1 < starts.size() ? starts[i + 1] : n;
      double t = getFirstIntersectionTime(p + begin, p + end);
      res = min(res, t);
    }
  }
  if (res >= inf) {
    printf("-1\n");
  } else {
    printf("%.10lf\n", res);
  }
  cerr << clock() << endl;
  return 0;
}
