#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int from, to, cost;
  bool operator<(Edge e) { return cost < e.cost; }
};
template <class T>
using vec = vector<T>;
template <class T>
using pql = priority_queue<T, vector<T>, greater<T>>;
string debug_show(pair<int, int> a) {
  return "(" + to_string(a.first) + "," + to_string(a.second) + ")";
}
template <class T>
struct augEdge {
  T from, to;
  int cost;
  bool operator<(augEdge e) { return cost < e.cost; }
  bool operator>(augEdge e) { return cost > e.cost; }
};
template <class T>
using augGraph = vector<augEdge<T>>;
int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  vector<int> a(n);
  for (int i = (int)(0); i < (int)(n); i++) cin >> a[i];
  sort((a).begin(), (a).end());
  vector<int> b(n);
  b = a;
  bool ans[8] = {false};
  int cnt1 = 0, cnt2 = 0;
  for (int i = (int)(0); i < (int)(n); i++) {
    int t = 0;
    a[i] -= 400;
    while (a[i] >= 0) {
      a[i] -= 400;
      t++;
    }
    if (t < 8) {
      ans[t] = true;
    } else {
      bool f = false;
      for (int j = (int)(0); j < (int)(8); j++) {
        if (ans[j] == true) {
          ans[j] = true;
          f = true;
        }
      }
      if (!f) {
        ans[0] = true;
      }
    }
  }
  for (int i = (int)(0); i < (int)(8); i++) {
    if (ans[i] == true) {
      cnt1++;
      ans[i] = false;
    }
  }
  a = b;
  for (int i = (int)(0); i < (int)(n); i++) {
    int t = 0;
    a[i] -= 400;
    while (a[i] >= 0) {
      a[i] -= 400;
      t++;
    }
    if (t < 8) {
      ans[t] = true;
    } else {
      for (int j = (int)(0); j < (int)(8); j++) {
        if (ans[j] != true) {
          ans[j] = true;
          break;
        }
      }
    }
  }
  for (int i = (int)(0); i < (int)(8); i++) {
    if (ans[i] == true) {
      cnt2++;
    }
  }
  cout << cnt1;
  cout << " ";
  cout << cnt2 << endl;
  return 0;
}
