ok,今天又是三节课的一天。
刚刚吃完饭的我一刻也不敢耽误,直接开干!!!
这些题和力扣上的,为了练习数据结构的题是不一样的。
直接上嘴脸
题目
第一次放学 (nowcoder.com)来自牛客网
思路
先看他的输入,分别是N ,M ,K,有 N 名学生,这些学生属于 M 个班级,有 K 名学生已经冲出了学校
然后下一行输入的是这些学生的分班。
那么这道题,就是看最多有多少学生是属于同一个班级的。
在这里我们先思考一个问题,如果你留下来的学生数量是 N - K,班级人数最多的班级人数为max,那么思考,最后你输出的答案是max吗?
答:
可以是,也可以不是,因为如果N - K > max,你觉得科学吗,科学,直接输出max
但是如果N - K < max呢?是不是输出max就不合理了,毕竟现在还在学校的人数都没有max个啊,这个时候是不是就需要输出N - K 个了。
也就是说
-
该班级本来就有的学生数量(即
max
): 这是因为我们不能超过班级本来的学生数量。 -
目前还没出校的学生数量(即
N - K
): 这是因为我们不能超过还没出校的学生总数。
因此,我们要在这两个限制因素中选择较小的那个值,以确保我们不超过实际的限制。如果 max
大于 N - K
,那么最多只能选择 N - K
个学生,因为这是目前还没出校的学生的数量。如果 N - K
大于 max
,那么最多只能选择 **max
**个学生,因为这是班级本来的学生数量。
所以,取 std::min(
max
,
N - K
)
是为了满足这两个限制条件,确保我们得到的值是合理的。
然后就是这道题,我的思路是,可以使用一个map集合,key是班级序号,value是这个班级的人数,N - K我们一开始就知道,所以我们只需要统计每个班级的人数,最后获取到那个班级的人数最多就完美了。
最后输出最小值
C++代码示例
cpp
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main(){
// N 学生数量
int N;
// M 个班级
int M;
// K 名学生已经冲出了学校
int K;
// 给他们赋值
cin >> N >> M >> K;
// 创建一个map集合
unordered_map <int, int> map;
// 统计学生的人数
for(int i = 0; i < N; i++){
int key;
cin >> key;
map[key]++;
}
// 获取人数最多的班级
int maxNum = 0;
for(int i = 0; i < M; i++){
maxNum = max(map[i + 1], maxNum);
}
// 输出答案
cout << min(maxNum, N - K);
return 0;
}
结语
代码中我也给出了极其详细的注释,欢迎大家讨论还有没有优化的方法。
今天就这样,┏(^0^)┛