题目大意:
有N个人,每个人都有一个要求a[i],意思是ta所在队伍人数必须大于或等于a[i]
解题思路:
dp/贪心
表示贪心打起来简单
从大到小排序一遍,然后贪心具体看源程序
dp的话只给出方程:
f[i]表示前i名队员最多分成的队伍数量
f[i]=max(f[j])+1,j∈[0,i–a[i]]
f
[
i
]
=
m
a
x
(
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
]
=
m
a
x
(
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);
}