#include <bits/stdc++.h>
using namespace std;
typedef struct P {
  int x, v;
} P;
bool operator<(const P &a, const P &b) { return a.x < b.x; }
typedef struct QItem {
  double val;
  int a, b;
} QItem;
int qsize;
QItem q[500000];
int qind[500000];
int up(int at) {
  while (at > 0) {
    int to = at / 2;
    if (q[to].val <= q[at].val) break;
    swap(q[at], q[to]);
    qind[q[at].a] = at;
    at = to;
  }
  qind[q[at].a] = at;
  return at;
}
int down(int at) {
  while (true) {
    int a = 2 * at + 1, b = 2 * at + 2, to = -1;
    if (a < qsize && q[a].val < q[at].val) to = a;
    if (b < qsize && q[b].val < q[at].val && (to == -1 || q[b].val < q[to].val))
      to = b;
    if (to == -1) break;
    swap(q[at], q[to]);
    qind[q[at].a] = at;
    at = to;
  }
  qind[q[at].a] = at;
  return at;
}
void update(double t, int a, int b) {
  int at = qind[a] != -1 ? qind[a] : qsize++;
  q[at].val = t;
  q[at].a = a;
  q[at].b = b;
  at = up(at);
  at = down(at);
}
void rem(int at) {
  assert(at != -1);
  qind[q[at].a] = -1;
  swap(q[at], q[--qsize]);
  if (at >= qsize) return;
  at = up(at);
  at = down(at);
}
void run() {
  int n;
  scanf("%d", &n);
  vector<P> p(n);
  for (int i = (0); i < (n); ++i) scanf("%d%d", &p[i].x, &p[i].v);
  vector<int> next(n, -1), prev(n, -1);
  double ret = -1;
  int at = 0;
  while (at < n) {
    int a = at;
    while (at < n && p[at].v > 0) ++at;
    int b = at;
    while (at < n && p[at].v < 0) ++at;
    int c = at;
    if (a == b || b == c) continue;
    for (int i = (a); i < (c - 1); ++i) next[i] = i + 1;
    next[c - 1] = -1;
    prev[a] = -1;
    for (int i = (a + 1); i < (c); ++i) prev[i] = i - 1;
    qsize = 0;
    for (int i = (a); i < (c); ++i) qind[i] = -1;
    for (int i = (a); i < (c - 1); ++i)
      if (p[i].x < p[next[i]].x && p[i].v != p[next[i]].v) {
        double t = 1.0 * ((long long)p[next[i]].x - p[i].x) /
                   ((long long)p[i].v - p[next[i]].v);
        if (t > 0)
          update(t, i, next[i]);
        else if (qind[i] != -1)
          rem(qind[i]);
      } else if (qind[i] != -1)
        rem(qind[i]);
    ;
    while (true) {
      assert(qsize > 0);
      double t = q[0].val;
      int i = q[0].a, j = q[0].b;
      assert(j == next[i]);
      if (p[i].v > 0 && p[j].v < 0) {
        if (ret == -1 || t < ret) ret = t;
        break;
      }
      assert(p[i].v > 0 && p[j].v > 0 || p[i].v < 0 && p[j].v < 0);
      if (p[i].v > 0) {
        next[i] = next[j];
        prev[j] = next[j] = -1;
        if (next[i] != -1) {
          prev[next[i]] = i;
          if (qind[j] != -1) rem(qind[j]);
          if (p[i].x < p[next[i]].x && p[i].v != p[next[i]].v) {
            double t = 1.0 * ((long long)p[next[i]].x - p[i].x) /
                       ((long long)p[i].v - p[next[i]].v);
            if (t > 0)
              update(t, i, next[i]);
            else if (qind[i] != -1)
              rem(qind[i]);
          } else if (qind[i] != -1)
            rem(qind[i]);
          ;
        }
      } else {
        prev[j] = prev[i];
        prev[i] = next[i] = -1;
        rem(0);
        if (prev[j] != -1) {
          next[prev[j]] = j;
          if (p[prev[j]].x < p[j].x && p[prev[j]].v != p[j].v) {
            double t = 1.0 * ((long long)p[j].x - p[prev[j]].x) /
                       ((long long)p[prev[j]].v - p[j].v);
            if (t > 0)
              update(t, prev[j], j);
            else if (qind[prev[j]] != -1)
              rem(qind[prev[j]]);
          } else if (qind[prev[j]] != -1)
            rem(qind[prev[j]]);
          ;
        }
      }
    }
  }
  printf("%.9lf\n", ret);
}
int main() {
  run();
  return 0;
}
