小美要将N名员工分成若干组,且每组至少要有一名员工。每个组都会产生一个单位的收益,且对于第i名员工,如果其所在的组包含至少A[i]名员工(包括第i名员工自身),则该员工会额外贡献一个单位的收益。现在,小美请小团将N名员工分组,使得总收益最大。
第一行输入一个整数T(1<=T<=10),表示数据组数。 每组数据占两行,第一行输入一个整数N(1<=N<=10^5); 第二行输入N个由空格隔开的整数,表示A[1]到A[N](1<=A[i]<=N)。
每组数据输出占一行,输出一个整数,表示总收益的最大值。
4 3 2 3 3 4 2 2 2 2 5 3 2 5 1 4 6 2 3 4 1 3 2
4 6 6 8
考点:贪心
数据规模 N ≤ 1e5 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:贪心
本题切入点
分组收益与组内人数有关:把 A[i] 升序排序后,能凑成一组的人尽量凑在一起,按阈值贪心分组求最大收益。
每一步都取当前最优,靠问题性质保证局部最优能拼成全局最优。
思路框架(贪心 通法 · 非本题专属)
实现要点:贪心题关键在于排序规则:按什么关键字排序决定了策略是否正确。
复杂度:时间 O(n log n)(含排序) | 空间 O(1) ~ O(n)
该范式的通法易错点
对照本题
样例 1:输入 4 / 3 / 2 3 3 / 4 / 2 2 2 2 / 5 / 3 2 5 1 4 / 6 / 2 3 4 1 3 2 → 输出 4 / 6 / 6 / 8
对于第一组数据,将3名员工都分在一组;
对于第二组数据,将4名员工分成两组,每组2名;
对于第三组数据,将5名员工都分在一组;
对于第四组数据,将第4名员工分成一组,其他员工都分在另一组。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:美团2023校招笔试-编程题(算法编程题)。