音乐是带给大家快乐的存在,而你的目标就是组建若干支乐队,让世界听到你们的演奏!
你目前有位乐手,每位乐手只能进入一个乐队,但并不是每位乐手都能担大任,因此需要团队合作。第
位乐手的能力值为
,表示该位乐手所在乐队的人数必须大于等于
。在保证每位乐手都被分进一个乐队的情况下,乐队数量最多可以是多少?
音乐是带给大家快乐的存在,而你的目标就是组建若干支乐队,让世界听到你们的演奏!
你目前有位乐手,每位乐手只能进入一个乐队,但并不是每位乐手都能担大任,因此需要团队合作。第
位乐手的能力值为
,表示该位乐手所在乐队的人数必须大于等于
。在保证每位乐手都被分进一个乐队的情况下,乐队数量最多可以是多少?
第一行一个正整数
,表示乐手人数,
。
第二行
个正整数
,表示每位乐手的能力值,
。
输出最多的乐队数量。若无法保证每位乐手都被分进一个乐队,则输出-1。
4 2 1 2 1
3
n = int(input()) arr = list(map(int, input().split())) arr.sort() # 无解 if arr[-1] > n: print(-1) # 只能组一个乐队 elif arr[-1] == n: print(1) else: # 先贪心地把「垃圾桶」乐队组出来 arr = arr[:-arr[-1]] n = len(arr) # dp[i] 表示用前 i + 1 个乐手组乐队的最优结果 dp = [0] * n dp[0] = 1 if arr[0] == 1 else 0 for i in range(1, n): # 有两种选择: # ① 当前乐手丢进垃圾堆,用前面 i - 1 个乐手组乐队 dp[i] = dp[i - 1] # ② 如果能满足当前乐手:贪心地为她组一个乐队,然后用剩下乐手继续组乐队 if arr[i] <= i + 1: dp[i] = max(dp[i], dp[i - arr[i]] + 1) print(dp[-1] + 1)