题目描述
音乐是带给大家快乐的存在,而你的目标就是组建若干支乐队,让世界听到你们的演奏!

你目前有nn位乐手,每位乐手只能进入一个乐队,但并不是每位乐手都能担大任,因此需要团队合作。第i位乐手的能力值为a[i],表示该位乐手所在乐队的人数必须大于等于a[i]。在保证每位乐手都被分进一个乐队的情况下,乐队数量最多可以是多少?

题目分析
话说刚开始都没看懂题目的意思,后面慢慢的,慢慢的....看了大佬的题解才慢慢懂了,因为题目说要乐队的数量最多并且乐队的每个人都有自己的要求,dp超级弱的我打死也想不到正解是dp,首先是一定要排序的,这样才会出现数量最多的情况,并且排完序之后就很容易满足乐手在乐队的人数大于等于a[i],然后我们去判断如果当前第i位乐手小于他的能力值ans=0,否则就维护一个前缀和,有点像最长递增子序列的思想,在前面找一个比它小但又是小里面最大的数加1,最后判断一下ans就行了(虽然写了这么多但是感觉还是有一点点没懂,莫名其妙的感觉)

#include <bits/stdc++.h>
using namespace std;

int a[100005], sum[100005];
int main()
{
    int n, ans;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    sort(a + 1, a + 1 + n);
    for (int i = 1; i <= n; i++)
    {
        if (i >= a[i])
            ans = sum[i - a[i]] + 1;
        else
            ans = 0;
        sum[i] = max(sum[i - 1], ans);
    }
    if (!ans)
        ans = -1;
    printf("%d\n", ans);
    return 0;
}