#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:128777216")
const long long LINF = 1000000000000000000LL;
const int INF = 1000000000;
const long double eps = 1e-9;
const long double PI = 3.1415926535897932384626433832795l;
using namespace std;
void prepare(string s) {
  if (s.length() != 0) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
  }
}
const int NMAX = 110;
int n;
int a[NMAX];
void read() {
  scanf("%d", &n);
  for (int i = 0; i < (int)n; i++) scanf("%d", &a[i]);
}
bool check(int mid) {
  int f[NMAX];
  for (int i = 0; i < (int)mid; i++) f[i] = INF;
  int id = mid - 1;
  for (int i = (int)n - 1; i >= 0; i--) {
    if (f[id] > 0) {
      f[id] = min(f[id] - 1, a[i]);
      id--;
      if (id < 0) id = mid - 1;
    } else {
      bool c = true;
      for (int i = 0; i < (int)mid; i++)
        if (f[i] != 0) c = false;
      if (c) return false;
      id = (id - 1 + mid - 1) % mid;
    }
  }
  return true;
}
void solve() {
  sort(a, a + n);
  int l = 0, r = n;
  while (r - l > 1) {
    int mid = (l + r) >> 1;
    if (check(mid))
      r = mid;
    else
      l = mid;
  }
  printf("%d\n", r);
}
int main() {
  prepare("");
  read();
  solve();
  return 0;
}
