ACM练习——第四天

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

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

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

直接上嘴脸

题目

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

ACM练习——第四天_第1张图片


思路

        先看他的输入,分别是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++代码示例 

#include 
#include 
#include 

using namespace std;

int main(){
    // N 学生数量
    int N;
    // M 个班级
    int M;
    // K 名学生已经冲出了学校
    int K;
    // 给他们赋值
    cin >> N >> M >> K;
    // 创建一个map集合
    unordered_map  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^)┛

你可能感兴趣的:(我的算法记录,C++之路,算法,c++)