# 난이도: 하, 메모리 제한: 128MB
# 첫째 줄에 모험가의 수 N이 주어진다. (1 <= n <= 100000)
# 둘째 줄에 각 모험가의 공포도 값을 n 이하의 자연수로 주어지며, 각 자연수는 공백으로 구분합니다.
# 여행을 떠날 수 있는 그룹 수의 최댓값을 출력하라.
""" input data
5
2 3 1 2 2
"""
""" output data
2
"""
import sys
input = sys.stdin.readline
def solve(gongpo: list) -> int:
result = 0
while gongpo:
max_num = max(gongpo)
del(gongpo[gongpo.index(max_num)])
gongpo.sort()
gongpo = gongpo[max_num:]
result += 1
return result
if __name__ == '__main__':
n = int(input())
gongpo = list(map(int, input().split()))
print(solve(gongpo))
# 난이도: 하, 메모리 제한: 128MB
# 첫째 줄에 모험가의 수 N이 주어진다. (1 <= n <= 100000)
# 둘째 줄에 각 모험가의 공포도 값을 n 이하의 자연수로 주어지며, 각 자연수는 공백으로 구분합니다.
# 여행을 떠날 수 있는 그룹 수의 최댓값을 출력하라.
# 공포도를 기준으로 오름차순으로 정렬을 수행하라
# 이후에 공포도가 가장 낮은 모험가부터 하나씩 확인하며, 그룹에 포함될 모험가의 수를 계산할 수 있다.
# 반복문으로 공포도를 하나씩 확인하며 "현재 그룹에 포함된 모험가의 수가 현재 확인하고있는 공포도"보다 크거나 같다면 이를 그룹으로 결성한다.
# 오름차순으로 정렬되어 있다는 점에서 항상 최소한의 모험가의 수만 포함하여 그룹을 결성하게 된다.
# 따라서, 최대한 많은 그룹이 구성되는 방법이다.
""" input data
5
2 3 1 2 2
"""
""" output data
2
"""
n = int(input())
data = list(map(int, input().split()))
data.sort()
result = 0
count = 0 # 현재 그룹에 포함된 모험가의 수
for i in data: # 공포도를 낮은 것부터 하나씩 확인
count += 1 # 현재 그룹에 해당 모험가를 포함
if count >= i: # 현재 그룹에 포함된 모험가의 수가 현재의 공포도 이상이라면, 그룹 결성
result += 1
count = 0 # 초기화
print(result) # 총 그룹의 수 출력