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

相关推荐
-芒果酱-5 分钟前
k-Means聚类算法 HNUST【数据分析技术】(2025)
算法·kmeans·聚类
渣渣威的仿真秀8 分钟前
Jensen-Shannon Divergence:定义、性质与应用
人工智能·算法·概率论
柒月的猫27 分钟前
求和(2022蓝桥杯A组试题C)
c语言·算法·蓝桥杯
simple_ssn35 分钟前
【蓝桥杯】压缩字符串
java·算法
青青丘比特1 小时前
STL.string(下)
开发语言·c++
c1assy1 小时前
DP动态规划+贪心题目汇总
数据结构·算法·leetcode·贪心算法·动态规划
jjjxxxhhh1231 小时前
C++ 模板是为了解决啥问题
开发语言·c++·算法
c++初学者ABC2 小时前
GESP2级2403 小杨的日字矩阵
c++·算法
大写-凌祁2 小时前
2024国赛A题第一问
线性代数·算法·机器学习·数学建模
代码小将2 小时前
PTA数据结构编程题7-1最大子列和问题
数据结构·c++·笔记·学习·算法