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++代码示例

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^)┛

相关推荐
格林威4 分钟前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
Lucis__31 分钟前
再探类&对象——C++入门进阶
开发语言·c++
北京不会遇到西雅图2 小时前
【SLAM】【后端优化】不同优化方法对比
c++·机器人
jndingxin2 小时前
c++多线程(6)------ 条件变量
开发语言·c++
程序员莫小特2 小时前
老题新解|大整数加法
数据结构·c++·算法
过往入尘土3 小时前
服务端与客户端的简单链接
人工智能·python·算法·pycharm·大模型
zycoder.3 小时前
力扣面试经典150题day1第一题(lc88),第二题(lc27)
算法·leetcode·面试
蒙奇D索大3 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
洲覆4 小时前
C++ 模板、泛型与 auto 关键字
开发语言·数据结构·c++
智驱力人工智能4 小时前
工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
人工智能·算法·安全·边缘计算·抽烟检测算法·工厂抽烟检测系统·吸烟监测