#include <bits/stdc++.h>
using namespace std;
bool foo;
template <typename T1, typename T2>
inline T1 max(T1 a, T2 b) {
  return a < b ? b : a;
}
template <typename T1, typename T2>
inline T1 min(T1 a, T2 b) {
  return a < b ? a : b;
}
const char lf = '\n';
namespace ae86 {
const int bufl = 1 << 15;
char buf[bufl], *s = buf, *t = buf;
inline int fetch() {
  if (s == t) {
    t = (s = buf) + fread(buf, 1, bufl, stdin);
    if (s == t) return EOF;
  }
  return *s++;
}
inline int ty() {
  int a = 0;
  int b = 1, c = fetch();
  while (!isdigit(c)) b ^= c == '-', c = fetch();
  while (isdigit(c)) a = a * 10 + c - 48, c = fetch();
  return b ? a : -a;
}
}  // namespace ae86
using ae86::ty;
const int _ = 2207 << 1, inf = 0x3f3f3f3f;
const long long linf = 0x3f3f3f3f3f3f3f3f;
struct costflow {
  static const int _n = _ * 6, _e = 633333;
  int to[_e], ne[_e], he[_n], ecnt;
  long long ev[_e], ec[_e];
  inline void adde(int a, int b, long long c, long long d) {
    to[++ecnt] = b, ev[ecnt] = c, ec[ecnt] = d, ne[ecnt] = he[a], he[a] = ecnt;
  }
  inline void addde(int a, int b, long long c, long long d) {
    adde(a, b, c, d), adde(b, a, 0, -d);
  }
  int S, T, dcnt;
  long long dis[_n];
  bool ed[_n];
  int bfs() {
    for (int i = 1; i <= dcnt; i++) dis[i] = linf, ed[i] = 0;
    queue<int> q;
    dis[S] = 0, q.emplace(S), ed[S] = 1;
    while (!q.empty()) {
      int a = q.front();
      q.pop(), ed[a] = 0;
      for (int i = he[a]; i; i = ne[i]) {
        int b = to[i];
        if (ev[i] <= 0 || dis[a] + ec[i] >= dis[b]) continue;
        dis[b] = dis[a] + ec[i];
        if (!ed[b]) q.emplace(b), ed[b] = 1;
      }
    }
    return dis[T] < linf;
  }
  int heb[_n];
  long long dfs(int x, long long f) {
    if (x == T || !f) return f;
    long long r = f;
    ed[x] = 1;
    for (int &i = heb[x]; i; i = ne[i]) {
      int b = to[i];
      if (ev[i] <= 0 || dis[x] + ec[i] != dis[b] || ed[b]) continue;
      long long g = dfs(b, min(r, ev[i]));
      r -= g, ev[i] -= g, ev[i ^ 1] += g;
      if (!r) break;
    }
    ed[x] = 0;
    return f - r;
  }
  pair<long long, long long> run(int s, int t) {
    S = s, T = t;
    long long sflw = 0, scos = 0;
    while (bfs()) {
      memcpy(heb, he, sizeof(he));
      long long dlt = dfs(s, linf);
      sflw += dlt, scos += dlt * dis[T];
    }
    return make_pair(sflw, scos);
  }
  costflow() { memset(he, 0, sizeof(he)), ecnt = 1; }
} f;
struct cxk {
  int id;
  long long k, b;
  cxk(int id_ = 0, long long k_ = 0, long long b_ = 0) {
    id = id_, k = k_, b = b_;
  }
  inline long long cal(long long t) { return k * t + b; }
};
int n, nn;
cxk ps[_];
inline int able(long long tim) {
  static pair<long long, int> stk[_ + _];
  int top = 0;
  for (int i = 1; i <= n; i++) {
    long long x = 0;
    for (int j = 1; j <= nn; j++)
      if (ps[i].b >= ps[j].b) x = max(x, ps[j].cal(tim));
    stk[++top] = make_pair(x, 1);
  }
  for (int i = n + 1; i <= nn; i++) stk[++top] = make_pair(ps[i].cal(tim), -1);
  sort(stk + 1, stk + top + 1);
  for (int i = top, val = 0; i >= 1; i--)
    if ((val += stk[i].second) < 0) return 0;
  return 1;
}
inline int xi(int x, int i) { return n * x + i; }
bool bar;
int main() {
  ios::sync_with_stdio(0), cout.tie(nullptr);
  n = ty(), nn = n + n;
  for (int i = 1, a, b; i <= nn; i++) a = ty(), b = ty(), ps[i] = cxk(i, a, b);
  long long ll = 0, rr = 1e9;
  while (rr > ll) {
    long long mid = (ll + rr) >> 1;
    if (able(mid))
      rr = mid;
    else
      ll = mid + 1;
  }
  if (!able(rr)) {
    cout << -1 << lf;
    return 0;
  }
  f.dcnt = n * 6;
  int s = ++f.dcnt, t = ++f.dcnt;
  for (int i = 1; i <= n; i++) {
    f.addde(s, xi(4, i), 1, 0);
    f.addde(xi(4, i), xi(0, i), 1, 1);
    f.addde(xi(4, i), xi(2, i), 1, 0);
    f.addde(xi(3, i), xi(5, i), 1, 1);
    f.addde(xi(1, i), xi(5, i), 1, 0);
    f.addde(xi(5, i), t, 1, 0);
  }
  for (int i = 1; i <= nn; i++) f.addde(xi(0, i), xi(2, i), inf, 0);
  sort(ps + 1, ps + nn + 1, [](cxk a, cxk b) { return a.b > b.b; });
  for (int l = 1, r = 1; l <= nn; l = r + 1) {
    r = l;
    while (r < nn && ps[r + 1].b == ps[l].b) r++;
    for (int i = l; i <= min(r, nn - 1); i++)
      f.addde(xi(0, ps[i].id), xi(0, ps[i + 1].id), inf, 0);
    f.addde(xi(0, ps[r].id), xi(0, ps[l].id), inf, 0);
  }
  sort(ps + 1, ps + nn + 1,
       [&](cxk a, cxk b) { return a.cal(rr) > b.cal(rr); });
  for (int l = 1, r = 1; l <= nn; l = r + 1) {
    r = l;
    while (r < nn && ps[r + 1].cal(rr) == ps[l].cal(rr)) r++;
    for (int i = l; i <= min(r, nn - 1); i++)
      f.addde(xi(2, ps[i].id), xi(2, ps[i + 1].id), inf, 0);
    f.addde(xi(2, ps[r].id), xi(2, ps[l].id), inf, 0);
  }
  auto ret = f.run(s, t);
  cout << rr << ' ' << ret.second << lf;
  return 0;
}
