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

相关推荐
念恒1230634 分钟前
继承(下) (Inheritance)
c++
海清河晏1112 小时前
数据结构 | 单循环链表
数据结构·算法·链表
H Journey2 小时前
C++之 CMake、CMakeLists.txt、Makefile
开发语言·c++·makefile·cmake
wuweijianlove6 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
研究点啥好呢6 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
_dindong6 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志6 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
沫璃染墨6 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_116 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode