Files
python/TangDou/JiShuanKe/2023-03-16/T3707.cpp
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

50 lines
1.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <bits/stdc++.h>
using namespace std;
int n;
const int N = 2e5 + 10;
int a[N];
int ans; // 组数
int cnt; // 当前组内人数
/*
Q:最多能组织多少个足球队?
A:举栗子说明:
3
1 2 2
① 将能力值从小到大排序,能力值为: 1 2 2
② 第1个小朋友,能力值a[1]=1,可以独立成班,创建新班级ans++,此时ans=1,表示1个班级已成班
③ 第2个小朋友,能力值a[1]=2,他要求2个人成班,他自己是1个,还要求再加入1个,
也就是下一个人也需要加入他们的班级,本轮没有班级成班成功
④ 第3个小朋友,能力值a[2]=2,继续加入到上个班中,在他加入后,此班的班额满足了第3个小朋友的要求,此班成班成功
总结:
(1)因为数据范围是2e5,所以O(N^2)的肯定要挂,O(NlogN)的也可能会挂,只能考虑O(N)或 O(logN)的算法
(2)贪心:考虑在现有规则下,什么样的学生应该留下来,什么样的学生应该抛弃掉?
肯定是要求低的留下来,要求高的扔掉。此处的要求就是:能力低,成班额度低。
也就是谁能力差谁留下,谁能力高谁不要。(这是什么鬼要求!!)
引导我们按能力值由小到大排序。
(3) 捋着由小到大的能力值,能成班的就让它们成班,实在成不了班,就放弃。
*/
int main() {
freopen("T3707.in", "r", stdin);
// freopen("T3707.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
// 由小到大排序
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++) {
cnt++; // 当前组人数+1
if (cnt >= a[i]) ans++, cnt = 0; // 成功完成一个成班,清空下一组人数为0
}
cout << ans << endl;
return 0;
}