#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
using vi = vector<ll>;
using vvi = vector<vi>;
using vb = vector<bool>;
using vs = vector<string>;
using vp = vector<pii>;
const int INF = (1 << 30) - 1;
const int MOD = 1e9 + 7;
const double EPS = 1e-9;
const double PI = acos(-1);
const int dx[] = {0, 1, 0, -1, 1, 1, -1, -1};
const int dy[] = {1, 0, -1, 0, 1, -1, 1, -1};
inline ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
inline ll minMult(ll x, ll n) { return n * (x / n + (x % n == 0 ? 0 : 1)); }
vi digits(ll n) {
  vi d;
  while (n) {
    d.push_back(n % 10);
    n /= 10;
  }
  reverse((d).begin(), (d).end());
  return d;
}
bool isPrime(ll n) {
  if (n < 2) return false;
  for (ll i = (2), i_len = ((sqrt(n) + 1)); i < i_len; i += (1)) {
    if (n % i == 0) return false;
  }
  return true;
}
void eratosthenes(vb& primes) {
  for (ll i = (0), i_len = ((ll)((primes).size())); i < i_len; i += (1))
    primes[i] = true;
  primes[0] = primes[1] = false;
  for (ll i = (0), i_len = ((ll)((primes).size()) / 2 + 1); i < i_len;
       i += (1)) {
    if (primes[i]) {
      for (ll j = (i + i), j_len = ((ll)((primes).size())); j < j_len; j += (i))
        primes[j] = false;
    }
  }
}
vi listDivisors(ll n) {
  vi divs;
  for (ll i = (1), i_len = (sqrt(n) + 1); i < i_len; i += (1)) {
    if (n % i == 0) {
      divs.push_back(i);
      divs.push_back(n / i);
    }
  }
  sort((divs).begin(), (divs).end());
  return divs;
}
map<ll, ll> primeFactorize(ll n) {
  map<ll, ll> prime_factors;
  ll m = n;
  for (ll i = (2), i_len = (sqrt(n) + 1); i < i_len; i += (1)) {
    if (m < 1) break;
    while (m % i == 0) {
      ++prime_factors[i];
      m /= i;
    }
  }
  if (m != 1) ++prime_factors[m];
  return prime_factors;
}
inline ll mod_add(ll a, ll b) { return (a + b) % MOD; }
inline ll mod_sub(ll a, ll b) { return (a + MOD - b) % MOD; }
inline ll mod_mul(ll a, ll b) { return ((a % MOD) * (b % MOD)) % MOD; }
ll mod_pow(ll x, ll y) {
  if (y == 0)
    return 1;
  else if (y == 1)
    return x % MOD;
  else if (y % 2 == 0) {
    ll val = mod_pow(x, (ll)(y / 2));
    return mod_mul(val, val);
  } else {
    ll val = mod_pow(x, (ll)(y / 2));
    return mod_mul(mod_mul(val, val), x);
  }
}
ll mod_inv(ll x) { return mod_pow(x, MOD - 2); }
ll mod_div(ll a, ll b) { return mod_mul(a, mod_inv(b)); }
ll fact(ll n) {
  ll m = n, ans = 1;
  while (m) {
    ans = mod_mul(ans, m);
    --m;
  }
  return ans;
}
ll comb(ll n, ll r) { return fact(n) / fact(n - r) / fact(r); }
template <typename T>
inline bool chmax(T& a, const T b) {
  if (a < b) a = b;
  return a < b;
}
template <typename T>
inline bool chmin(T& a, const T b) {
  if (a > b) a = b;
  return a > b;
}
template <typename T>
inline void print(const T& x) {
  cout << x << "\n";
}
template <typename T, typename U>
istream& operator>>(istream& is, pair<T, U>& p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T, typename U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
  os << p.first << " " << p.second;
  return os;
}
template <typename T>
istream& operator>>(istream& is, vector<T>& v) {
  for (auto && (in) : (v)) is >> in;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  for (ll i = (0), i_len = ((ll)((v).size())); i < i_len; i += (1)) {
    os << v[i] << (i + 1 != (ll)((v).size()) ? " " : "");
  }
  return os;
}
struct Init {
  Init() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(10);
  }
} init;
int main() {
  ll N;
  cin >> N;
  map<ll, ll> color;
  ll free = 0;
  for (ll i = (0), i_len = (N); i < i_len; i += (1)) {
    ll a;
    cin >> a;
    if (a < 3200)
      ++color[a / 400];
    else
      ++free;
  }
  ll mi = (ll)((color).size());
  ll ma = min((ll)8, (ll)((color).size()) + free);
  cout << mi << " " << ma;
}
