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; }