思路:这题第一眼贪心,但具体怎么贪就需要仔细想想了。首先可以注意到一个特判,当数组a最大值>数组长度n时,这个最大值无法组乐队,直接输出-1。除此之外的其他情况都可以组乐队,比如最差情况下,所有人一起组一个乐队

然后就是怎么贪心了,这个不太好弄,我想了一个多小时,WA了11发才解决。具体流程如下:首先看一个样例1 1 1 4,如果直接从小到大贪心,会出问题。为什么?因为末尾的4我们其实应该组成1 1 1 4才行,从小到大贪心就会剩下单独的4,不知道该怎么放,所以说应该从大到小贪心。那再来看一个样例 1 1 1 4 4 4 4 4,如果说从大到小贪心,会出问题。为什么?因为从左往右的第一个4会和前面的1组成1 1 1 4,这样会使我们可以组成的队伍变少,更好的方法是前面的3个1单独为3个队伍,然后从左往右的第一个4与他后面的那些4组成一队。所以说,单纯的从小到大或者从大到小贪心都是错的

因此,正确的解决方法是这样的:首先我们把最大的那个数,从大到小贪心,组成一队;然后再从小到大贪心,最大化组队个数。由于最大的那一队的成员数量就是最大值,因此当我们从小到大贪心时,不能组队的那些人,就都可以放到最大的那一队。最终输出结果即可

代码:

import sys
input = lambda: sys.stdin.readline().strip()

import math
inf = 10 ** 18

def I():
    return input()

def II():
    return int(input())

def MII():
    return map(int, input().split())

def GMI():
    return map(lambda x: int(x) - 1, input().split())

def LI():
    return input().split()

def LII():
    return list(map(int, input().split()))

def LFI():
    return list(map(float, input().split()))

fmax = lambda x, y: x if x > y else y
fmin = lambda x, y: x if x < y else y
isqrt = lambda x: int(math.sqrt(x))

'''

'''

def solve():
    n = II()
    a = LII()

    if max(a) > n:
        print(-1)
        return

    a.sort()
    mx = a[-1]
    a = a[:n - mx]
    ans = 1

    cnt = 0
    for x in a:
        cnt += 1
        if cnt >= x:
            ans += 1
            cnt = 0
    print(ans)

t = 1
# t = II()
for _ in range(t):
    solve()