跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

CSP 201412-1 门禁系统题解与思路分析

CSP 201412-1 门禁系统题目要求统计每条记录中读者编号出现的次序。输入 n 个整数,输出每个数在当前序列前缀中的出现次数。示例采用双重循环遍历数组,通过比较当前元素与后续元素是否相等来累加计数。虽然时间复杂度为 O(n²),但在 n≤1000 的约束下完全可行。代码使用全局数组存储输入及计数结果,利用 memset 初始化内存,确保数据正确性。实际开发中可考虑哈希表优化至 O(n)。

未来可期发布于 2025/2/5更新于 2026/6/1322 浏览
CSP 201412-1 门禁系统题解与思路分析

CSP 201412-1 门禁系统

问题背景

涛涛负责图书馆管理工作,需要记录每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。

输入输出说明

输入格式 第一行包含一个整数 n,表示记录条数。 第二行包含 n 个整数,依次表示每位读者的编号。

输出格式 输出一行,包含 n 个整数,由空格分隔,依次表示每条记录中的读者编号是第几次出现。

样例

输入:
5
1 2 1 1 3
输出:
1 1 2 3 1

解题思路

这道题的核心在于统计每个数字在当前位置之前(含当前位置)出现的次数。

虽然可以使用哈希表来优化到 O(n) 的时间复杂度,但考虑到题目约束 n ≤ 1000,直接使用双重循环暴力枚举也是完全可行的。这种方法逻辑直观,代码实现简单,非常适合初学者理解计数过程。

具体做法是遍历数组,对于每一个位置 j,向前扫描所有 i ≤ j 的位置,如果 s1[i] == s1[j],则计数器加一。这样就能准确得到该编号当前的出现次序。

代码实现

下面是具体的 C++ 实现方案。为了保持代码简洁且符合规范,我清理了部分冗余头文件和未使用的函数,并增加了必要的注释。

#include <iostream>
#include <cstring> // 使用 memset 需要此头文件
using namespace std;

const int MAXN = 1005;
int s1[MAXN], s2[MAXN];

int main() {
    // 初始化数组,防止全局变量或内存中的垃圾值干扰
    memset(s1, 0, sizeof(s1));
    memset(s2, 0, sizeof(s2));

    int n;
    if (scanf("%d", &n) != 1) return 0;

    // 读取所有来访记录
    for (int i = 0; i < n; i++) {
        scanf("%d", &s1[i]);
    }

    // 核心逻辑:对于第 i 条记录,统计它前面(包括自己)有多少次出现过相同的编号
    // 这里采用双重循环暴力枚举,在 N<=1000 时性能足够
    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            if (s1[i] == s1[j]) {
                s2[j]++;
            }
        }
    }

    // 输出结果
    for (int i = 0; i < n; i++) {
        printf("%d ", s2[i]);
    }
    return 0;
}

总结

这段代码通过简单的嵌套循环完成了计数任务。在实际工程场景中,如果数据量增大,建议改用 std::map 或 std::unordered_map 来存储频次,将时间复杂度降低至 O(n)。但对于算法竞赛的入门题目,掌握这种基础的双重循环逻辑是非常必要的。

  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 2025 年 12 月 GESP CCF 编程能力等级认证 Python 一级真题
  • CCF-GESP 2024 年 3 月三级 C++ T2 完全平方数解题思路
  • 基于大模型辅助数据分析的开源项目 ezdata 架构解析
  • R 语言在 AIGC 时代的数据分析应用与实践
  • ListView 条目无法点击问题的解决方案
  • SpringBoot 源码解析:AnnotationConfigServletWebServerApplicationContext 构造方法
  • ClawX 可视化 AI 智能体工具介绍与使用指南
  • Vheer:免费免登录的 AI 绘画与视频生成工具
  • RabbitMQ 基础入门
  • AI 工具链实战:MLflow 实验跟踪与模型管理
  • Python 日志模块 logging 使用指南
  • 算法模拟实战:替换所有问号与提莫攻击
  • 智驾后融合感知核心:融合策略设计与量产落地框架
  • AgentScope Java:阿里开源的 LLM 智能体框架
  • Python 爬虫逆向兼职实战指南
  • Spring Cloud 微服务架构概述
  • Web 项目 UI 自动化测试实战:从零搭建博客系统框架
  • ModelSim 仿真软件安装与使用指南
  • Microsoft Visual C++ 运行库官网下载指南(2015-2022)
  • FauxPilot:开源 GitHub Copilot 替代方案本地部署指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

目录

  1. CSP 201412-1 门禁系统
  2. 问题背景
  3. 输入输出说明
  4. 解题思路
  5. 代码实现
  6. 总结
  • 💰 8折买阿里云服务器限时8折了解详情