B 乐***对

分析

考虑 表示以 结尾可划分出的最多队伍数。对于不合法的方案只有可能最大的那个人的要求大于了总人数。而对于 转移只有两种决策。

  • 加入上一组。
  • 新开一组。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e5 + 100;
    int f[N],n,a[N];
    int main()
    {
      cin >> n;
      for(int i = 1;i <= n;i++) cin >> a[i];
      sort(a+1,a+1+n);
      for(int i = 1;i <= n;i++) {
          if(i - a[i] + 1 >= 1) f[i] = max(f[i-a[i]]+1,f[i-1]);
      }
      (n-a[n]<0)?cout << "-1" << endl:cout << f[n] << endl;
      return 0;
    }