• 前言

    初见此题,便一贪为敬,不曾想,数据过强,需dp,作此篇,解此题QwQ
    图片说明

  • 分析

    可以发现,如果这个人要加入团队,一定是和[1,i],[2,i]...[i-a[i],i]这些人组队,并且当前的a[i]要小于等于i,那这里就可以记下一笔

    dp[i]=max(dp[1~(i-a[i])])+1;

    但是n>1e4,n^2肯定凉凉,于是我们开始思考,能不能去掉一重循环。可以知道如果我们存下dp[1~(i-a[i])]的最大值,就可以不用循环了

  • 代码

#include<bits/stdc++.h>
const int N=1e5+10;
using namespace std;
int n;
int a[N],dp[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    sort(a+1,a+n+1);

    if(a[n]>n) puts("-1");
    else
    {
        for(int i=1;i<=n;i++)
        {
               if(a[i]<=i)
                   dp[i]=max(dp[i-1],dp[i-a[i]]+1);
            else dp[i]=0;
        }

        printf("%d\n",dp[n]);
    }

    return 0;
}