#include <bits/stdc++.h>
const int INF = 1e9;
const long long INFLL = 1e18;
const int NMAX = 105;
const int MMAX = 100005;
const int KMAX = 1005;
const int MOD = 1e9 + 7;
using namespace std;
static const int di[] = {-1, 0, 1, -1, 1, -1, 0, 1};
static const int dj[] = {-1, -1, -1, 0, 0, 1, 1, 1};
struct edge {
  int to, cost;
};
void debug(const char *format, ...) {
  va_list arg;
  va_start(arg, format);
  vprintf(format, arg);
  va_end(arg);
}
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}
long long BSearch(long long _begin, long long _end, bool (*f)(int)) {
  long long mid;
  while (_end - _begin > 1LL) {
    mid = (_begin + _end) / 2LL;
    if (f(mid)) {
      debug("BSearch: f(%d) == true\n", mid);
      _end = mid;
    } else {
      debug("BSearch: f(%d) == false\n", mid);
      _begin = mid;
    }
  }
  return _end;
}
int N, M, K, A[NMAX], B = 0, C = 0, D, E;
bool dp[9] = {};
string S;
vector<int> v;
long long ans = 0;
int F(int rate) {
  if (rate >= 3200)
    return 0;
  else if (rate >= 2800)
    return 1;
  else if (rate >= 2400)
    return 2;
  else if (rate >= 2000)
    return 3;
  else if (rate >= 1600)
    return 4;
  else if (rate >= 1200)
    return 5;
  else if (rate >= 800)
    return 6;
  else if (rate >= 400)
    return 7;
  else
    return 8;
}
void solve() {
  for (int i = 0; i < N; ++i) {
    if (F(A[i])) {
      if (!dp[F(A[i])]) C++;
      dp[F(A[i])] = true;
    } else {
      B++;
    }
  }
}
void debug() {}
void answer() {
  cout << (C == 0 && B > 0 ? 1 : C) << " " << min(C + B, 8) << endl;
}
int main(int argc, char const *argv[]) {
  cin >> N;
  for (int i = 0; i < N; ++i) {
    cin >> A[i];
  }
  solve();
  debug();
  answer();
  return 0;
}
