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

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

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WenJGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值