• ACM练习——第四天


    ok,今天又是三节课的一天。

    刚刚吃完饭的我一刻也不敢耽误,直接开干!!!

    这些题和力扣上的,为了练习数据结构的题是不一样的。

    直接上嘴脸

    题目

    第一次放学 (nowcoder.com)来自牛客网


    思路

            先看他的输入,分别是N ,M ,K,有 N 名学生,这些学生属于 M 个班级,有 K 名学生已经冲出了学校

            然后下一行输入的是这些学生的分班。

            那么这道题,就是看最多有多少学生是属于同一个班级的。

            在这里我们先思考一个问题,如果你留下来的学生数量是 N - K,班级人数最多的班级人数为max,那么思考,最后你输出的答案是max吗?

    答:

            可以是,也可以不是,因为如果N - K > max,你觉得科学吗,科学,直接输出max

            但是如果N - K < max呢?是不是输出max就不合理了,毕竟现在还在学校的人数都没有max个啊,这个时候是不是就需要输出N - K 个了。

    也就是说

    1. 该班级本来就有的学生数量(即 max): 这是因为我们不能超过班级本来的学生数量。

    2. 目前还没出校的学生数量(即 N - K): 这是因为我们不能超过还没出校的学生总数。

    因此,我们要在这两个限制因素中选择较小的那个值,以确保我们不超过实际的限制。如果 max大于 N - K,那么最多只能选择 N - K个学生,因为这是目前还没出校的学生的数量。如果 N - K大于 max,那么最多只能选择 max个学生,因为这是班级本来的学生数量。

    所以,取 std::min(max, N - K) 是为了满足这两个限制条件,确保我们得到的值是合理的。

            然后就是这道题,我的思路是,可以使用一个map集合,key是班级序号,value是这个班级的人数,N - K我们一开始就知道,所以我们只需要统计每个班级的人数,最后获取到那个班级的人数最多就完美了。

    最后输出最小值


    C++代码示例 

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main(){
    6. // N 学生数量
    7. int N;
    8. // M 个班级
    9. int M;
    10. // K 名学生已经冲出了学校
    11. int K;
    12. // 给他们赋值
    13. cin >> N >> M >> K;
    14. // 创建一个map集合
    15. unordered_map <int, int> map;
    16. // 统计学生的人数
    17. for(int i = 0; i < N; i++){
    18. int key;
    19. cin >> key;
    20. map[key]++;
    21. }
    22. // 获取人数最多的班级
    23. int maxNum = 0;
    24. for(int i = 0; i < M; i++){
    25. maxNum = max(map[i + 1], maxNum);
    26. }
    27. // 输出答案
    28. cout << min(maxNum, N - K);
    29. return 0;
    30. }

    结语

    代码中我也给出了极其详细的注释,欢迎大家讨论还有没有优化的方法。

    今天就这样,┏(^0^)┛

  • 相关阅读:
    网络安全(黑客)自学
    编译调试Net6源码
    QT专栏2 -Qt for Android
    Unity中UI Shader遮罩RectMask2D
    Java应用开发各种奇葩的问题
    获取Class类的实例的几种方式
    C语言结构体详解
    java毕业设计家教管理系统mybatis+源码+调试部署+系统+数据库+lw
    0819(035天 线程/进程06 synchronizedu详解)
    【Cocos2D -x | C++】CCNODe学习 |几个常见报错解决 |cocos2d-x“无法打开源文件”
  • 原文地址:https://blog.csdn.net/DDDDWJDDDD/article/details/134448632