题意
给出n个人,其中第i个人要放到人数 >=a[i] >= a [ i ] 的队里,现在给出每个人的要求,求出最多可以分成几队。
思路
刚开始打了个接近 n3 n 3 的贪心,水到了60分。这题正解是dp,但是听了某大佬的贪心算法,我就打了一个贪心。用need表示我们当前的队里面还要加上多少个人才能满足队里面每个人的需求,枚举每一个人,每次让need-1,如果need=0说明人够了就可以累加答案并且更新need,如果这个人的需求比当前需求need小,就把need更新为a[i],给它另起一队,可以让队数更多。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[1000001],need,ok,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);
need=a[1];
for (int i=1;i<=n;i++)
{
if (a[i]<need) need=a[i];
need--;//每次的需求都会-1
if (!need)//人的条件满足了
{
need=a[i];//更新need
ans++;//累加答案
}
}
printf("%d",ans);
}