You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.0 KiB
2.0 KiB
足球小队
题目描述
蒜老师为了提高同学们的身体素质,想要在班里组织若干个足球队。(每个足球队的人数有可能不同。)
第 i
同学有一个训练值 a_i
,对于这个同学想要加入的足球队来说,这个足球队的人数一定要大于等于 a_i
。
不一定每个人都要加入足球队,问蒜老师最多能组织多少个足球队。
输入格式
输入共两行。
第一行输入一个正整数 n
,表示班里有多少同学。
第二行输入 n
个以空格隔开的正整数 a_i
,第 i
个数表示第 i
个同学的训练值。
输出格式
输出共一个整数,表示蒜老师最多能组织多少个足球队。
数据范围
对于 10\%
的数据,有 1\leq n\leq 10^3
,且每个同学的训练值 a_i=1
。
对于另外 20\%
的数据,有 1\leq n\leq 10^3
,且每个同学的训练值 a_i
等于 1
或等于 2
。
对于另外 100\%
的数据,有 1\leq n\leq 2\times 10^5,1\leq a_i\leq n
。
题解
对于一个满足条件的队伍:队伍人数 cnt
要大于等于该队伍中所有人的 a_j
值,即 cnt \geq \max\{a_j\}
,满足第 j
个人在该队伍中。
可以考虑贪心求解,因为对于人数要大于等于队伍中所有人 a_i
的最大值,所以将 a_i
从小到大排序,然后再按照顺序将人加入到队伍中,满足条件后,维护下一个队伍。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 200010;
int n, a[maxn];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + n + 1);
int ans = 0, cnt = 0;
for (int i = 1; i <= n; i++) {
cnt++;
if (cnt >= a[i]) {
ans++;
cnt = 0;
}
}
cout << ans << endl;
return 0;
}