当前位置: 首页 > news >正文

牛客小白月赛115-B题:签到题

题目传送门牛客网竞赛题目

一、题目描述

给定n道题目,每道题难度为aᵢ。要从中选出m道题组成比赛,使得难度最低的题目(签到题)数量尽可能多。求签到题的最大可能数量。

输入

  • 第一行两个整数n,m(1≤m≤n≤2×10⁵)
  • 第二行n个整数表示题目难度aᵢ(1≤aᵢ≤n)

示例1
输入:

5 3
1 2 2 2 3

输出:

3

二、题目分析

我们需要从n道题中选m道,使得难度最低的题目尽可能多。关键在于找出m个数的窗口,然后把最低的一个数的数量找出最大值,借助后缀和数组s实现

三、解题思路

  1. 统计每个难度出现的次数
  2. map按照键值从小到大,这道题刚刚好满足我们要的
  3. 从最小难度开始检查:如果比当前难度大的题目总数+当前难度题目数≥m,则当前难度可以作为最低难度

四、算法讲解

  1. 统计各难度出现频率(使用map自动排序)
  2. 预处理后缀和数组s[i]表示难度≥vec[i]的题目总数
  3. 对于每个难度,检查能否作为最低难度:
    • 若能,则最大数量为min(该难度题目数,m)
    • 否则终止检查(后续难度更大不可能更优,因为后缀和的是数量)

五、代码实现

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 +10;
map<int, int> mp; // 统计各难度出现次数(自动按难度排序)
int n, m;
int s[N]; // 后缀和数组int main()
{cin >> n >> m;for (int i = 1; i <= n; i++){int x;cin >> x;mp[x]++; // 统计每个难度出现次数}// 将map转为vector便于处理vector<pair<int, int>> vec(mp.begin(), mp.end());int n = vec.size();// 计算后缀和:s[i]表示难度≥vec[i]的题目总数for (int i = n - 1; i >= 0; i--){s[i] = s[i + 1] + vec[i].second;}int ans = 0;for (int i = 0; i < n; i++){// 如果选择当前难度作为最低难度,是否能有足够题目if (s[i] >= m){// 最大数量不超过当前难度题目数,也不超过mans = max(ans, vec[i].second);}elsebreak; // 后续难度更大,不可能更优}cout << min(ans, m); // 最终结果不超过mreturn 0;
}

六、代码重点细节解释

  1. map<int, int> mp:自动按难度排序并统计频次
  2. 后缀和数组s[i]:快速获取难度≥当前难度的题目总数
  3. 贪心检查:从最小难度开始,一旦发现无法满足条件立即终止
  4. min(ans, m):确保结果不超过题目总数m

七、复杂度分析

  • 时间复杂度:O(nlogn)(map插入和排序的复杂度)
  • 空间复杂度:O(n)(存储频次和后缀和)
http://www.xdnf.cn/news/133651.html

相关文章:

  • Python Cookbook-6.9 快速复制对象
  • 代码随想录算法训练营第60期第十七天打卡
  • 小白如何使用Cursor运行python程序(含环境配置教程)
  • 隐形革命:环境智能如何重构“人-机-境“共生新秩序
  • 关于循环缓冲区
  • 【java源码】AI智能导诊系统,基于H5、小程序、app等多端,引导患者自助就诊挂号,实现科学就诊
  • 4G卡的DTU固件TCP通讯
  • 【Rust】Rust中的枚举与模式匹配,原理解析与应用实战
  • 秒级到毫秒:BFD的速度革命
  • Swift闭包(Closure)深入解析与底层原理
  • SAM 2 (Segment Anything ):图像与视频通用分割模型
  • Vue里面elementUi-aside 和el-main不垂直排列
  • 知识蒸馏和迁移学习的区别
  • 在项目中使用 Sonar:提升代码质量的利器
  • 深入理解机器学习:人工智能的核心驱动力
  • AI之FastAPI+ollama调用嵌入模型OllamaBgeEmbeddings
  • SQL笛卡尔积运用-为每个用户初始化数据
  • [Windows] 卡巴斯基Kaspersky 21.21.7.384 免费版
  • 基于Axure的动态甘特图设计:实现任务增删改与时间拖拽交互
  • 打工人必看:Word中姓名对齐的高效方法
  • 计算器(WEB)
  • PWNOS:2.0(vulnhub靶机)
  • Java知识日常巩固(五)
  • 在GNS3中安装Kali Linux
  • 【深度好文】2、深入浅出 Milvus 数据库管理:从创建到删除的完整指南
  • spark-standalone模式
  • 设置Rocky Linux盒盖不休眠的3个简单步骤
  • 常见的几种分块策略,每种策略都有适用场景和优缺点
  • 题目 3320: 蓝桥杯2025年第十六届省赛真题-产值调整
  • 【爬虫】DrissionPage-获取douyim用户下的视频