新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++算法初赛模拟卷:覆盖STL、二分查找与位运算高频考点

发布时间:2026/9/15 0:08:12来源:尧图网络
C++算法初赛模拟卷:覆盖STL、二分查找与位运算高频考点
这份卷子是我近期给备赛学生做训练时用的第3套模拟卷今天整理成文直接分享给大家。全国青少年信息素养大赛算法应用主题赛这个赛道近几年报名热度一直很高C组初赛的题型相对稳定主要考察三件事语法基础扎不扎实、能不能读懂别人写的程序、以及面对一道基础算法题能不能在限时内写出能跑的代码。很多孩子是第一次参加对初赛题型心里没底刷真题又担心难度不合适所以我干脆按近两年初赛常见命题风格编了一套模拟卷3覆盖C语法细节、STL容器、位运算、排序、二分查找和简单搜索满分100分难度略高于初赛平均线适合已经学完语法、正在刷算法题的选手用来自测带赛老师也可以直接当周测卷用。1. 卷面设计与考点布局1.1 为什么初赛卷要这样出初赛和决赛不一样决赛拼的是上机编程速度和正确率而初赛更多是“筛选”。出题人要在有限时间内快速判断一个选手到底有没有系统学过C、有没有基本的算法思维所以题型通常分成三类选择题考概念边界和语法细节阅读程序题考手动模拟代码的能力算法应用题考最基础的编码实现。这套模拟卷就完全按照这个逻辑来设计。8道单选题覆盖数组越界、递归、冒泡排序、位运算、STL容器、缓存局部性、二分细节、结构体排序这些知识点在历年初赛里反复出现做题时你会明显感觉到题目不难但每个选项都有陷阱概念模糊的孩子特别容易踩坑。阅读程序题则选了循环累加、递归斐波那契、字符频率统计三个经典场景难度循序渐进。三道算法应用题分别对应基础模拟、二分查找、全排列DFS属于初赛编程题里最常出现的几种类型。1.2 建议答题时间分配与做题顺序这份卷子我建议按90分钟限时来训练。选择题控制在30分钟以内平均每道题不超过4分钟单选题遇到犹豫的先圈出来不要死磕后面时间多再回头想。阅读程序题给35分钟这部分最忌讳用眼睛“虚空读代码”一定要动手画表逐行跟踪变量变化。最后25分钟留给三道算法应用题。很多学生习惯先做编程题认为分值高但我建议的顺序是先阅读程序题再做选择题因为阅读题需要清醒的脑子去手算而选择题相对独立放在状态下降时做容错率更高。编程题哪怕时间紧也至少要把框架写出来争取拿到部分分。2. 题目构成与高频考点拆解2.1 选择题语法细节与STL陷阱选择题看起来是送分题实际上失分最严重。我见过太多孩子单独问语法都懂一放到选择题里就选错原因在于初赛选择题特别爱考“边界情况”和“未定义行为”。比如数组越界很多老师上课会强调“不要越界”但没人告诉你越界到底会发生什么于是题目一改成“编译能过吗运行时会怎样”学生就懵了。还有递归很多学生背过“递归必须有终止条件”但对“没有终止条件会怎样”理解不深不知道最终是栈溢出。这套卷子的选择题考点里位运算x (x - 1)是一个被低估的高频考点它能把整数二进制表示中最低位的1变成0很多进阶算法比如树状数组、统计二进制中1的个数都用它。STL容器特性也是个重点尤其是set自动有序这一点和vector、queue混在一起考最能区分基础是否扎实。2.2 阅读程序题手算能力决定成败阅读程序题考察的不是“你看没看懂”而是“你算得对不对”。我常跟学生讲代码是人写的程序是机器跑的读代码时你不能按照自己的心意替机器省略步骤。一个最实用的方法就是列变量跟踪表把每个变量的初始值写在表头然后逐行执行每执行一行就更新一次表格。特别是递归程序很多孩子一看递归就害怕其实只要坚持“把递归调用一层一层展开”的手算方式f(6)这种问题完全可以像剥洋葱一样剥出来。阅读程序题还有一个隐藏考点输出格式。比如要不要换行、有没有空格题目问的是“输出结果”而不是“程序功能”手算时如果忽略细节明明逻辑对了写答案时却漏了换行符照样丢分。这套卷子阅读题里我会专门安排一道统计字符出现次数的题来帮你检查对数组下标的敏感度。2.3 算法应用题从“会思路”到“写得出、写得对”很多学生在训练时面临一个尴尬思路能说清楚但一上机就编译报错或者边界条件处理不好。初赛的算法题通常不会出偏题怪题重点在于你能不能把脑子里的思路转成一行行正确的代码。以二分查找为例几乎人人都会说“二分查找就是不断折半”但真正写的时候while循环条件是l r还是l r、mid到底取(l r) / 2还是l (r - l) / 2、区间是左闭右开还是左闭右闭这些细节一个搞错就全错。所以算法应用题的备考建议很简单平时刷题不要只看思路一定要把完整代码敲进电脑里跑一遍用样例去验证再自己设计边界数据去测试。这个习惯培养起来初赛编程题的基本分就稳了。3. 模拟卷3正文2026年算法应用主题赛C初赛模拟卷3建议闭卷作答限时90分钟满分100分。3.1 单项选择题每题5分共40分1.声明int a[5];之后执行a[5] 10;下列说法正确的是 A. 编译错误C不允许数组下标越界 B. 编译可能通过但运行属于未定义行为可能修改未知内存 C. 数组会自动扩容可以正常存储 D. 运行时一定会触发段错误2.关于递归函数下列说法正确的是 A. 递归函数必须返回 int 类型 B. 递归函数必须包含终止条件否则会无限递归并最终导致栈溢出 C. 递归函数只能调用自己一次 D. 递归函数的运行效率一定高于循环3.对序列{6, 3, 8, 2, 5}使用冒泡排序从小到大排序第一趟排序完成后序列为 A.{3, 6, 2, 5, 8}B.{2, 3, 5, 6, 8}C.{6, 3, 2, 8, 5}D.{3, 2, 5, 6, 8}4.对任意正整数 x表达式x (x - 1)的作用是 A. 判断 x 是否为偶数 B. 把 x 的二进制表示中最低位的 1 变成 0 C. 把 x 的二进制表示中最高位的 1 变成 0 D. 交换 x 的低位字节与高位字节5.在STL中向下列哪个容器插入元素后容器中的元素会自动保持有序 A. vector B. list C. set D. queue6.二维数组按行遍历比按列遍历通常更快主要原因是 A. 按行遍历时CPU缓存命中率更高能减少内存访问延迟 B. 按行遍历时循环次数更少 C. 二维数组只能按行遍历按列遍历会编译失败 D. 按列遍历会发生数组越界7.在二分查找的循环while (l r)中相比int mid (l r) / 2;更推荐的写法是 A.int mid l (r - l) / 2;B.int mid (r l) * 2;C.int mid r / 2 l / 2;D. 两种写法没有任何区别8.阅读以下程序输出是 #include bits/stdc.h using namespace std; struct Stu { int id, score; }; bool cmp(Stu a, Stu b) { return a.score b.score; } int main() { vectorStu v {{1, 88}, {2, 95}, {3, 78}}; sort(v.begin(), v.end(), cmp); for (auto s : v) cout s.id ; return 0; }A.1 2 3B.2 1 3C.3 2 1D.1 3 23.2 阅读程序题每题10分共30分阅读题1#include iostream using namespace std; int main() { int sum 0; for (int i 1; i 10; i) { if (i % 2 0) sum i; } cout sum endl; return 0; }1输出结果______阅读题2#include iostream using namespace std; int f(int n) { if (n 2) return 1; return f(n - 1) f(n - 2); } int main() { cout f(6) endl; return 0; }2输出结果______阅读题3#include iostream #include string using namespace std; int main() { string s hello; int cnt[26] {0}; for (int i 0; i (int)s.size(); i) { cnt[s[i] - a]; } int ans 0; for (int i 0; i 26; i) { if (cnt[i] 0 cnt[i] % 2 0) ans; } cout ans endl; return 0; }3输出结果______3.3 算法应用题每题10分共30分第1题字符频率统计输入一行只包含小写字母的字符串长度不超过100按字典序输出每个出现过的字母及其出现次数每行格式为字母:次数。输入样例hello输出样例e:1 h:1 l:2 o:1第2题二分查找程序填空给定一个升序排列的整数数组a长度 n 不超过 100000有 q 次询问每次询问一个整数 x请输出 x 在数组中第一次出现的位置下标从 0 开始。如果 x 不存在输出 -1。已有程序框架如下请在空格处补全二分查找逻辑。#include bits/stdc.h using namespace std; int a[100005]; int lower_bound_custom(int n, int x) { int l 0, r n; // 左闭右开区间 [l, r) while (l r) { int mid ________; // 第一空求中点 if (________) // 第二空判断 a[mid] 与 x 的关系 r mid; else l mid 1; } return l; } int main() { int n, q; cin n q; for (int i 0; i n; i) cin a[i]; while (q--) { int x; cin x; int pos lower_bound_custom(n, x); if (pos ! n a[pos] x) cout pos endl; else cout -1 endl; } return 0; }输入样例5 3 1 3 3 5 7 3 4 7输出样例1 -1 4第3题排列生成输入一个正整数 n1 ≤ n ≤ 8按字典序输出 1 到 n 的所有全排列每个排列占一行数字之间用一个空格隔开。输入样例3输出样例1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 14. 参考答案与逐题解析4.1 选择题答案速查与解析题号12345678答案BBABCAAB第1题解析C不会检查普通数组的越界所以编译阶段通常不会报错。但运行时越界访问是未定义行为可能没有明显问题也可能悄悄改写了相邻内存甚至导致程序崩溃因此不要抱有侥幸心理从编码习惯上就应该杜绝越界。第2题解析递归就像套娃每一层调用都会占栈空间如果没有终止条件栈会被一层层塞满直到溢出程序崩溃。递归的终止条件就是“最小的那个套娃”必须最先想清楚。第3题解析冒泡排序第一趟从左往右两两比较6和3交换6和8不交换8和2交换8和5交换最大的8被“冒”到最后所以结果是{3, 6, 2, 5, 8}。这个考点不仅考排序过程还考“第一趟结束后最大值一定在末尾”这个性质。第4题解析x (x - 1)是经典位运算技巧。x - 1会把x最低位的1变成0并把之后的所有0变成1再与x做按位与最低位的1就被抹掉了。例如x 12二进制1100x - 1 111011按位与得到10008。第5题解析set内部使用红黑树实现插入元素后会自动按排序规则排列。vector和list都是线性容器不会自动排序。queue是队列只保证先进先出更谈不上有序。第6题解析C二维数组按行存储按行遍历时访问的地址连续CPU缓存命中率高很多所以速度快。这也是为什么算法题里处理矩阵时尽量让内层循环按连续内存方向访问。第7题解析当 l 和 r 都很大时l r可能超过int范围导致溢出。l (r - l) / 2用差值代替求和从根本上避免了溢出问题等价但更安全是竞赛中推荐的标准写法。第8题解析sort传入自定义比较函数cmpreturn a.score b.score表示按分数从高到低排序。95分、88分、78分对应id 2、1、3所以输出2 1 3。4.2 阅读程序题解析阅读题1的答案是30。程序从1循环到10把其中所有偶数累加也就是 2 4 6 8 10 30。这道题是送分题但能帮你检查循环变量取值范围i 10和i 10是初赛特别喜欢埋的陷阱。阅读题2的答案是8。f(6)是斐波那契数列递推关系为f(n)f(n-1)f(n-2)边界是f(1)1、f(2)1。手算时可以按层级展开f(6)f(5)f(4)(f(4)f(3))(f(3)f(2))继续展开到边界最终得到8。注意不要心算跳步写清楚展开式能有效减少出错。阅读题3的答案是1。程序统计字符串 hello 中每个字母出现的次数h出现1次e出现1次l出现2次o出现1次。然后统计“出现次数为偶数的字母种类”只有l是2次所以ans1。这道题重点考察两个细节一是s[i] - a这个把字符映射到数组下标的操作这是字符统计题的通用套路二是“偶数字母种类”而不是“偶数个字母”很多孩子看题快了就数成4个字母。4.3 算法应用题参考代码与得分要点第1题参考代码#include bits/stdc.h using namespace std; int main() { string s; cin s; int cnt[26] {0}; for (int i 0; i (int)s.size(); i) { cnt[s[i] - a]; } for (int i 0; i 26; i) { if (cnt[i] 0) { cout char(a i) : cnt[i] endl; } } return 0; }得分要点数组要初始化为0输出时按字典序枚举a到z而不是按字母在字符串中出现的先后顺序输出。我见过不少孩子把输出写成“遍历原字符串每个字符立即输出次数”结果重复输出比如hello会输出两次l。正确做法是先统计到cnt数组里再统一遍历26个下标输出。第2题参考答案第一空l (r - l) / 2第二空a[mid] x完整逻辑说明这是标准的左闭右开二分。当a[mid] x时说明第一个大于等于x的位置不可能出现在mid右边所以把右边界收缩到mid否则左边界移动到mid1。循环结束后l指向第一个大于等于x的位置。主函数里再判断a[pos] x就能确定x是否存在。这个写法等价于STL的lower_bound初赛和复赛都经常用建议背熟。第3题参考代码#include bits/stdc.h using namespace std; int n, path[10]; bool used[10]; void dfs(int step) { if (step n) { for (int i 0; i n; i) { if (i) cout ; cout path[i]; } cout endl; return; } for (int i 1; i n; i) { if (!used[i]) { used[i] true; path[step] i; dfs(step 1); used[i] false; } } } int main() { cin n; dfs(0); return 0; }得分要点DFS搜索全排列时路径数组path和标记数组used是标配。记得回溯时把used[i]重新设为false否则下一个分支就没办法使用这个数字了。输出格式要求“数字之间用一个空格隔开”行末不能有多余空格所以我用if (i) cout 先在每个非首元素前输出空格。n最大只有8递归深度最多8层完全不用担心性能。5. 从这份卷子暴露出的问题聊赛前冲刺5.1 初赛踩坑实录与排查技巧每次我做模拟卷批改都会把学生错误整理成一张“高频踩坑清单”这份卷子同样适用。下面这些坑基本是初赛里出现频率最高的问题类型典型错误排查与改进方法数组越界访问a[n]而不是a[n-1]写循环前先确认数组区间记住C下标从0开始变量未初始化计数器sum忘记赋0养成定义变量就立刻初始化的习惯输入读取cin读取字符串遇空格截断如果题目字符串可能含空格改用getline递归边界递归调用时漏掉终止条件写递归函数先问自己“最小规模怎么返回”二分细节循环条件和区间开闭搞混固定使用一种模板不要三套模板混着记排序规则cmp函数返回值理解反记住less是升序greater是降序自定义时用例子验证输出格式行末多一个空格、漏掉换行提交前用样例测试肉眼对比输出5.2 最后两周的“性价比”复习策略如果距离初赛只剩两周我的建议是不要盲目刷难题而是把重心放在“基础题零失误”上。具体来说分两条线走。第一条线把这份卷子里的选择题每个考点都彻底搞懂如果你发现set为什么有序、位运算为什么会清掉最低位的1这类概念还要翻书那就把对应的STL容器和位运算专题重新过一遍找几道简单题练手。第二条线把二分查找和全排列DFS这两道题背到“条件反射”的程度因为初赛编程题大概率涉及其中一个而这两个题型的模板非常固定只要背熟并理解基本分就拿到了。每天花一到两个小时上机把模板代码敲一遍再用不同输入样例测试比反复看教程有效得多。5.3 一些带赛过程中沉淀下来的心得带学生备赛这几年我越来越觉得初赛刷题不在多在“复盘”。一份卷子做完对照答案不算完要把每道错题旁边写清“我为什么错”和“下次怎么避免”这才是这份模拟卷最大的价值。很多孩子同一类错误会犯三次第一次是不知道第二次是不小心第三次就是没有认真复盘。另外上机编程时一定要养成自己造测试数据的习惯比如做字符统计就试一下只有1个字符的情况、26个字母全出现的情况做二分就试一下x比所有数都小、x比所有数都大的情况边界数据一测很多隐藏bug就现形了。竞赛到最后拼的不只是智商更是严谨和习惯。这套模拟卷如果能限时完成并稳定拿到85分以上说明你的C基础和算法应用能力已经比较扎实可以安心进入决赛备赛阶段。我个人在实际训练中还会要求学生把错题对应的知识点做成一个小卡片考前翻一遍比临考抱佛脚刷题要轻松得多也踏实得多。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

sherpa-onnx 中 WeSpeaker 说话人嵌入模型 ONNX 元数据注入指南:从 pretrained 模型到可直接推理的完整流程 2026/9/15 1:08:17

sherpa-onnx 中 WeSpeaker 说话人嵌入模型 ONNX 元数据注入指南:从 pretrained 模型到可直接推理的完整流程

sherpa-onnx 中 WeSpeaker 说话人嵌入模型 ONNX 元数据注入指南:从 pretrained 模型到可直接推理的完整流程 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen K…

阅读更多 →
军工视频安全传输:SpringCloud微服务加密架构实践 2026/9/15 1:08:17

军工视频安全传输:SpringCloud微服务加密架构实践

1. 项目背景与核心挑战在国防军工领域,视频文件的传输安全直接关系到国家机密保护。传统HTTP协议传输存在三大安全隐患:数据明文传输易被截获、分片重组可能被篡改、缺乏端到端身份验证机制。SpringCloud作为分布式微服务架构,需要在这些限制…

阅读更多 →
Navicat密码管理机制与恢复实战指南 2026/9/15 1:08:17

Navicat密码管理机制与恢复实战指南

1. Navicat密码管理机制解析Navicat作为数据库管理工具中的佼佼者,其密码存储机制经历了多次迭代。从Navicat 12版本开始,采用了基于AES-256-CBC的加密方案,相比早期版本的简单编码方式,安全性有了质的提升。加密后的密码会存储在…

阅读更多 →
Telegraf 集成 systemd 凭据存储(systemd-creds)实现安全的明文凭据注入 2026/9/15 1:08:17

Telegraf 集成 systemd 凭据存储(systemd-creds)实现安全的明文凭据注入

Telegraf 集成 systemd 凭据存储(systemd-creds)实现安全的明文凭据注入 【免费下载链接】telegraf Agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data. 项目地址: https://gitcode.com/GitHub_Tr…

阅读更多 →
记住我功能的安全隐患与防御实践 2026/9/15 1:08:17

记住我功能的安全隐患与防御实践

1. "记住我"功能的安全隐患剖析"记住我"这个看似贴心的功能按钮,几乎出现在所有需要登录的网站和应用中。作为用户,我们早已习惯在咖啡馆的公共电脑上勾选它,在手机浏览器里依赖它,甚至在企业内网系统中信任它…

阅读更多 →
论文排版终极攻略|90%毕业生都在踩的格式坑!okbiye一键搞定零翻车 2026/9/15 1:05:17

论文排版终极攻略|90%毕业生都在踩的格式坑!okbiye一键搞定零翻车

很多同学论文内容写得完美,查重、降重全部达标,最后却栽在格式排版上。 导师终审、学校盲审、系统定稿上传,格式细微错乱直接打回重改,熬夜调好的文档,换台电脑、上传系统就全盘崩盘。其实论文排版根本不用逐行手动微…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞