B - Young Explorers(Codeforces Round #737 (Div. 2))
题目描述
题目大意
每个人都有一个经验值,他只能加入人数比他经验值高或者等于他经验值的小组中。
问最多可以分多少组。
思路
贪心,将每个人按经验值从低到高排序
从前往后遍历,记录经验的最大值和目前的人数。
若人数和最大经验值相等,则ans+1
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
int num=0;
int need=0;
int ans=0;
for(int i=0;i<n;i++)
{
need=max(need,a[i]);
num++;
if(num==need)
{
need=num=0;
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}