恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

算法竞赛入门:清点人数问题的数据结构与优化

  • 首页
  • 资讯中心
  • /
  • 算法竞赛入门:清点人数问题的数据结构与优化

相关资讯

Windows自动登录后保持锁屏:安全与便捷的平衡方案 2026/8/18 1:32:57
LLM智能体上下文管理:基于次模优化的PACMS框架解析与实践 2026/8/18 1:32:57
从代码补全到智能体编程:基于MCP协议构建GitHub Copilot实战工作流 2026/8/18 1:32:57

最新资讯

Bootloader开发全解析:从启动原理到U-Boot实战与安全设计
一小时搞定YOLOv8环境搭建与自定义数据集训练:从零到部署全流程
【单片机毕业设计推荐】基于 STM32 或 51 单片机的水质多参数监测与自动换水控制系统设计 基于 STM32 或 51 单片机的水体 PH、温度、浊度智能监测装置设计(021606)
【单片机毕业设计推荐】基于 STM32 或 51 单片机的水质多参数监测与自动换水控制系统设计 基于 STM32 或 51 单片机的水体 PH、温度、浊度智能监测装置设计(021506)
深夜蓝屏救星实测:我用SMUDebugTool给Ryzen平台做了一次全身体检
2025年网络安全威胁与防御技术前瞻

今日推荐

数据缺失处理:从MCAR、MAR到MNAR的机制解析与多重插补实践
MAGS-SLAM:多智能体协同3D高斯泼溅SLAM系统解析
LLM智能体记忆管理:基于关键词门控的混合激活机制CAMeR详解

本周热门

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码
【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码
隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

算法竞赛入门:清点人数问题的数据结构与优化

发布时间:2026/8/18 1:32:57
算法竞赛入门:清点人数问题的数据结构与优化 1. 问题背景与题目解析清点人数这道题目出自《信息学奥赛一本通》第1538页是典型的算法竞赛入门级练习题。这类题目通常考察选手对基础数据结构的掌握和简单算法的应用能力。题目核心要求是模拟一个班级点名系统需要处理三种操作学生报到增加人数学生请假减少人数查询当前出勤人数这类问题看似简单但在实际竞赛中往往作为复杂问题的子模块出现。比如在更高级的题目中可能需要维护多个班级的出勤情况或者需要处理动态区间的人数统计。2. 数据结构选型与复杂度分析2.1 基础变量方案最直观的解法是使用一个整型变量count来记录当前人数int count 0; // 报到操作 count; // 请假操作 count--; // 查询操作 cout count endl;时间复杂度增删改查都是O(1) 空间复杂度O(1)这种方案适用于单一班级的简单场景但无法扩展。2.2 数组扩展方案当需要管理多个班级时可以使用数组int classes[100]; // 假设最多100个班级 // 1班报到 classes[1]; // 2班请假 classes[2]--;时间复杂度指定班级操作为O(1) 空间复杂度O(n)n为班级数量2.3 哈希表高级方案对于班级编号不连续或数量不确定的情况建议使用哈希表unordered_mapint, int attendance; // 103班报到 attendance[103]; // 205班请假 attendance[205]--;时间复杂度平均O(1)最坏O(n) 空间复杂度O(m)m为实际存在的班级数3. 输入输出处理要点3.1 输入格式解析标准竞赛题通常给出如下格式输入第一行操作数量n 随后n行每行一个操作 A x - x班报到 B x - x班请假 Q x - 查询x班人数示例代码int n; cin n; while(n--) { char op; int x; cin op x; switch(op) { case A: /* 报到处理 */ break; case B: /* 请假处理 */ break; case Q: /* 查询处理 */ break; } }3.2 输出优化技巧在算法竞赛中输出效率也很关键使用\n代替endl避免频繁刷新缓冲区对于大量查询考虑先缓存结果最后统一输出使用printf比cout更快但类型安全性较低4. 边界条件与异常处理4.1 常见边界情况初始空班级查询应返回0请假人数超过当前人数时竞赛题通常保证数据合法实际工程中需要处理负数情况超大班级编号超过int范围操作数量n为0的特殊情况4.2 防御性编程示例unordered_maplong long, int attendance; // 使用long long防止编号溢出 void checkIn(long long classId) { attendance[classId]; } void checkOut(long long classId) { if(attendance.count(classId) attendance[classId] 0) { attendance[classId]--; } // 竞赛中可以简化为直接减因为题目保证数据合法 }5. 算法优化进阶思路5.1 多班级批量操作当需要处理区间操作时如1-10班各增加3人朴素做法是for(int i1; i10; i) { attendance[i] 3; }时间复杂度O(n)更高效的方案是使用差分数组将区间操作降为O(1)// 差分数组 int diff[100010] {0}; // 1-10班各加3 diff[1] 3; diff[11] - 3; // 最终人数计算前缀和 for(int i1; in; i) { diff[i] diff[i-1]; }5.2 实时统计优化如果需要频繁查询总人数可以额外维护一个total变量int total 0; void checkIn(int x) { attendance[x]; total; } void checkOut(int x) { if(attendance[x] 0) { attendance[x]--; total--; } }这样查询总人数时直接返回total无需遍历所有班级。6. 实际竞赛中的变形题目6.1 带权人数统计有些题目会给学生赋予权重如学分需要计算unordered_mapint, int count; // 人数 unordered_mapint, int weight; // 总权重 void weightedCheckIn(int classId, int w) { count[classId]; weight[classId] w; }6.2 动态班级管理更复杂的题目可能涉及创建/删除班级合并两个班级拆分班级这时需要更复杂的数据结构设计可能涉及并查集等高级算法。7. 代码实现完整示例#include iostream #include unordered_map using namespace std; int main() { unordered_mapint, int attendance; int n; cin n; while(n--) { char op; int x; cin op x; switch(op) { case A: attendance[x]; break; case B: if(attendance.count(x) attendance[x] 0) { attendance[x]--; } break; case Q: cout (attendance.count(x) ? attendance[x] : 0) \n; break; } } return 0; }8. 调试与测试技巧8.1 测试用例设计建议设计以下测试场景单一班级反复报到/请假多个班级交叉操作边界值测试最大班级编号压力测试10^5次操作示例测试用例6 A 1 A 2 A 1 Q 1 B 1 Q 1预期输出2 18.2 在线评测注意事项注意题目给出的数据范围选择合适的数据类型使用更快的输入输出方法如关闭cin同步确保没有内存泄漏虽然竞赛程序结束后会回收注意初始化变量避免使用未定义值9. 性能对比实验我们对比三种实现方式的性能单位ms操作次数基础变量数组哈希表1e42351e51518251e6120150220结论对于简单场景基础变量方案最优需要灵活管理多个班级时哈希表是最佳选择。10. 工程实践中的扩展应用在实际系统开发中类似需求很常见在线课堂学生人数统计会议室预订系统库存管理系统实时在线用户监控这些场景下我们还需要考虑持久化存储数据库分布式环境下的数据一致性高并发下的线程安全一个生产级实现可能如下public class AttendanceService { private final ConcurrentHashMapInteger, AtomicInteger attendance; public AttendanceService() { this.attendance new ConcurrentHashMap(); } public void checkIn(int classId) { attendance.computeIfAbsent(classId, k - new AtomicInteger(0)) .incrementAndGet(); } public int getCount(int classId) { return attendance.getOrDefault(classId, new AtomicInteger(0)).get(); } }

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号