#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005, Inf = 1e9;
inline int gi() {
  char c = getchar();
  while (c < '0' || c > '9') c = getchar();
  int sum = 0;
  while ('0' <= c && c <= '9') sum = sum * 10 + c - 48, c = getchar();
  return sum;
}
int n, a[maxn], b[maxn], Id[maxn], vis[maxn];
long long v[maxn];
priority_queue<pair<long long, long long> > q;
bool cmp(int x, int y) { return v[x] == v[y] ? x > y : v[x] < v[y]; }
bool check(int T) {
  priority_queue<pair<long long, long long> > tmp;
  swap(q, tmp);
  for (int i = 1; i <= 2 * n; ++i) Id[i] = i, vis[i] = 0;
  for (int i = 1; i <= 2 * n; ++i) v[i] = b[i];
  sort(Id + 1, Id + 2 * n + 1, cmp);
  for (int i = 1; i <= 2 * n; ++i) {
    q.push(make_pair((long long)T * a[Id[i]] + b[Id[i]], i));
    if (Id[i] <= n) vis[Id[q.top().second]]++;
  }
  for (int i = 1; i <= 2 * n; ++i) v[i] = (long long)a[i] * T + b[i];
  sort(Id + 1, Id + 2 * n + 1, cmp);
  int cnt = 0;
  for (int i = 1; i <= 2 * n; ++i) {
    if (Id[i] > n) --cnt;
    cnt += vis[Id[i]];
    if (cnt > 0) return 0;
  }
  return 1;
}
struct edge {
  int to, next, cap, cost;
} e[maxn * 50];
int h[maxn * 6], tot;
int S, T, pu[maxn * 6], pe[maxn * 6];
inline void add(int u, int v, int w, int f) {
  e[++tot] = (edge){v, h[u], w, f};
  h[u] = tot;
  e[++tot] = (edge){u, h[v], 0, -f};
  h[v] = tot;
}
queue<int> que;
int dis[maxn * 6];
bool spfa() {
  static bool vis[maxn * 6];
  memset(dis, 63, sizeof(int) * (T + 1));
  memset(vis, 0, sizeof(bool) * (T + 1));
  que.push(S);
  vis[S] = true;
  dis[S] = 0;
  int u, v;
  while (!que.empty()) {
    u = que.front();
    que.pop();
    vis[u] = false;
    for (int i = h[u]; ~i; i = e[i].next)
      if (dis[v = e[i].to] > dis[u] + e[i].cost && e[i].cap) {
        dis[v] = dis[u] + e[i].cost;
        pe[v] = i;
        pu[v] = u;
        if (!vis[v]) que.push(v), vis[v] = true;
      }
  }
  return dis[T] < 1e9;
}
int solve(int t) {
  S = 6 * n + 1;
  T = S + 1;
  tot = -1;
  memset(h, -1, sizeof(int) * (T + 1));
  for (int i = 1; i <= n; ++i) {
    add(S, i, 1, 0);
    add(i, i + n, 1, 1);
    add(i, i + 3 * n, 1 << 20, 0);
    add(i + n, i + 3 * n, 1 << 20, 0);
    add(i + 2 * n, i + 4 * n, 1 << 20, 0);
    add(i + 2 * n, i + 5 * n, 1 << 20, 0);
    add(i + 4 * n, i + 5 * n, 1, 1);
    add(i + 5 * n, T, 1, 0);
  }
  for (int i = 1; i <= 2 * n; ++i) Id[i] = i, v[i] = b[i];
  sort(Id + 1, Id + 2 * n + 1, cmp);
  for (int i = 2 * n; i >= 2; --i) {
    add(Id[i] + n, Id[i - 1] + n, 1 << 20, 0);
    if (v[Id[i]] == v[Id[i - 1]])
      add(Id[i - 1] + 1 * n, Id[i] + 1 * n, 1 << 20, 0);
  }
  for (int i = 1; i <= 2 * n; ++i) v[i] = (long long)a[i] * t + b[i];
  sort(Id + 1, Id + 2 * n + 1, cmp);
  for (int i = 2 * n; i >= 2; --i) {
    add(Id[i] + 3 * n, Id[i - 1] + 3 * n, 1 << 20, 0);
    if (v[Id[i]] == v[Id[i - 1]])
      add(Id[i - 1] + 3 * n, Id[i] + 3 * n, 1 << 20, 0);
  }
  int cost = 0, flow = 0;
  while (spfa()) {
    int f = Inf, c = 0;
    for (int i = T; i != S; i = pu[i]) {
      f = min(f, e[pe[i]].cap);
      c += e[pe[i]].cost;
    }
    cost += f * c;
    flow += f;
    for (int i = T; i != S; i = pu[i]) {
      e[pe[i]].cap -= f;
      e[pe[i] ^ 1].cap += f;
    }
  }
  return cost;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= 2 * n; ++i) scanf("%d%d", &a[i], &b[i]);
  int l = 0, r = Inf;
  while (l < r) {
    int mid = (l + r) >> 1;
    if (check(mid))
      r = mid;
    else
      l = mid + 1;
  }
  if (l == Inf)
    puts("-1");
  else
    printf("%d %d\n", l, solve(l));
  return 0;
}
