题目大意:
有N个人,每个人都有一个要求a[i],意思是ta所在队伍人数必须大于或等于a[i]
解题思路:
dp/贪心
表示贪心打起来简单
从大到小排序一遍,然后贪心具体看源程序
dp的话只给出方程:
f[i]表示前i名队员最多分成的队伍数量
f[i]=max(f[j])+1,j∈[0,i–a[i]]f[i]=max(f[j])+1,j∈[0,i–a[i]]
前缀和优化
f[i]=s[i–a[i]]+1;s[i]=max(s[i−1],f[i]);f[i]=s[i–a[i]]+1;s[i]=max(s[i−1],f[i]);
源程序:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[1000001],ans;
bool cmp(int x,int y){return x>y;}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1,cmp);
int now=a[1];//当前需求量
for (int i=1;i<=n;i++)
{
if (a[i]<now)
now=a[i];//选择最优
now--;//每次加上一个人需求量都加1
if (!now)//有一个队伍了
{
ans++;
now=a[i];//总和+1并赋值新需求量
}
}
printf("%d",ans);
}