C/C++蓝桥杯算法真题打卡(Day3)
一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷

算法代码:
#include<bits/stdc++.h>
using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; // 用于存储所有ID(方便排序)int num;// 读取所有IDfor (int i = 0; i < N; i++) {while (cin >> num) {ids.push_back(num); // 将ID存入vectoridCount[num]++; // 统计ID出现的次数if (cin.get() == '\n') break; // 换行时结束当前行的读取}}// 对ID进行排序sort(ids.begin(), ids.end());int missing = -1, duplicate = -1; // 断号ID和重号ID// 查找重号for (auto& pair : idCount) {if (pair.second == 2) {duplicate = pair.first; // 找到重号break;}}// 查找断号for (int i = ids[0]; i <= ids.back(); i++) {if (idCount.find(i) == idCount.end()) {missing = i; // 找到断号break;}}// 输出结果cout << missing << " " << duplicate << endl;return 0;
}
代码思路
1. 输入处理
- 读取数据行数
N。 - 使用
unordered_map<int, int>统计每个ID出现的次数。 - 使用
vector<int>存储所有ID,方便后续排序。
2. 读取所有ID
- 使用
while (cin >> num)逐行读取ID,直到遇到换行符\n结束当前行的读取。 - 将每个ID存入
vector<int> ids中,并在unordered_map<int, int> idCount中统计其出现次数。
3. 排序
- 对
vector<int> ids进行排序,方便后续查找断号和重号。
4. 查找重号
- 遍历
unordered_map<int, int> idCount,找到出现次数为2的ID,即为重号。
5. 查找断号
- 从最小ID(
ids[0])到最大ID(ids.back())遍历,检查每个ID是否在unordered_map<int, int> idCount中。 - 如果某个ID不在
unordered_map中,则说明它是断号。
6. 输出结果
- 输出断号ID
missing和重号IDduplicate。
代码实现细节
1. 头文件
#include<bits/stdc++.h>
using namespace std;
- 使用万能头文件
bits/stdc++.h,包含所有标准库。 - 使用
using namespace std,避免每次调用标准库时需要写std::。
2. 主函数
int main() {int N;cin >> N;
- 读取数据行数
N。
3. 数据存储
unordered_map<int, int> idCount;
vector<int> ids;
int num;
unordered_map<int, int> idCount:用于统计每个ID出现的次数。vector<int> ids:用于存储所有ID,方便后续排序。
4. 读取所有ID
for (int i = 0; i < N; i++) {while (cin >> num) {ids.push_back(num);idCount[num]++;if (cin.get() == '\n') break;}
}
- 逐行读取ID,存入
vector<int> ids中。 - 使用
unordered_map<int, int> idCount统计每个ID出现的次数。 - 当遇到换行符
\n时,结束当前行的读取。
5. 排序
sort(ids.begin(), ids.end());
- 对
vector<int> ids进行排序,方便后续查找断号和重号。
6. 查找重号
int missing = -1, duplicate = -1;
for (auto& pair : idCount) {if (pair.second == 2) {duplicate = pair.first;break;}
}
- 遍历
unordered_map<int, int> idCount,找到出现次数为2的ID,即为重号。
7. 查找断号
for (int i = ids[0]; i <= ids.back(); i++) {if (idCount.find(i) == idCount.end()) {missing = i;break;}
}
- 从最小ID(
ids[0])到最大ID(ids.back())遍历,检查每个ID是否在unordered_map<int, int> idCount中。 - 如果某个ID不在
unordered_map中,则说明它是断号。
8. 输出结果
cout << missing << " " << duplicate << endl;
- 输出断号ID
missing和重号IDduplicate。
9. 返回
return 0;
- 程序正常结束。
示例运行
输入
2
7 9
5 6 8 11 9
输出
10 9
总结
- 代码通过
unordered_map统计ID出现次数,结合排序和遍历,高效地找到断号和重号。 - 时间复杂度为
O(n),其中n是ID的总数。 - 代码逻辑清晰,适合处理题目描述中的场景。
还有另一种形式(不排序,直接使用哈希表):
#include <iostream>
#include <unordered_set>
using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_set<int> idSet; // 用于存储所有IDint minID = INT_MAX, maxID = INT_MIN; // 记录最小ID和最大IDint num;// 读取所有IDfor (int i = 0; i < N; i++) {while (cin >> num) {idSet.insert(num); // 将ID存入哈希表minID = min(minID, num); // 更新最小IDmaxID = max(maxID, num); // 更新最大IDif (cin.get() == '\n') break; // 换行时结束当前行的读取}}int missing = -1, duplicate = -1; // 断号ID和重号ID// 查找重号unordered_set<int> seen;for (int id : idSet) {if (seen.count(id)) {duplicate = id; // 找到重号break;}seen.insert(id);}// 查找断号for (int i = minID; i <= maxID; i++) {if (idSet.find(i) == idSet.end()) {missing = i; // 找到断号break;}}// 输出结果cout << missing << " " << duplicate << endl;return 0;
}
二、P8775 [蓝桥杯 2022 省 A] 青蛙过河 - 洛谷

算法代码:
#include <bits/stdc++.h>
#define N 100005
using namespace std;int n, T, h[N], ans;int main() {// 读取河的宽度 n 和需要去学校的天数 Tscanf("%d%d", &n, &T);// 将 T 乘以 2 得到实际过河的次数T <<= 1;// 读取每块石头的高度for (int i = 1; i < n; ++i) scanf("%d", &h[i]);// 使用滑动窗口的方法来找到满足条件的最小跳跃能力for (int i = 1, j = 0, sum = 0; i < n; i++) {// 扩展窗口的右边界,直到累加的高度大于等于 Twhile (j < n && sum < T) sum += h[++j];// 记录当前窗口的长度,即跳跃能力ans = max(ans, j - i + 1);// 缩小窗口的左边界,减去左边石头的高度sum -= h[i];}// 输出满足条件的最小跳跃能力printf("%d\n", ans);return 0;
}
规律:
对于一个跳跃能力 y,青蛙能跳过河 2x 次,当且仅当对于每个长度为 y 的区间,这个区间内 h 的和都大于等于 2x
这个问题涉及到对青蛙跳跃能力和石头高度分布的分析。我们需要理解为什么对于一个跳跃能力 y,青蛙能够跳过河 2x次,当且仅当对于每个长度为 y 的区间,这个区间内石头高度 h 的和都大于等于 2x。
1. 问题背景
-
青蛙需要往返 2x 次,每次跳跃必须落在石头或岸上。
-
每块石头的高度 h[i]表示这块石头可以被踩的次数。
-
跳跃能力 y 表示青蛙一次跳跃的最大距离。
2. 跳跃能力 y 的含义
-
如果青蛙的跳跃能力是 y,那么它每次跳跃的距离不能超过 y。
-
这意味着青蛙在跳跃时,只能选择距离当前位置不超过 y 的石头。
3. 为什么需要每个长度为 y 的区间和 ≥2x
-
必要性:
-
如果存在一个长度为 y的区间,其石头高度和 <2x,那么青蛙在这个区间内无法完成 2x 次跳跃。
-
因为青蛙每次跳跃必须落在石头上,而石头的高度限制了可以被踩的次数。
-
如果某个区间的石头高度和不足 2x,青蛙在这个区间内无法完成足够的跳跃次数。
-
-
充分性:
-
如果每个长度为 y 的区间的石头高度和 ≥2x,那么青蛙可以在每个区间内完成足够的跳跃次数。
-
因为青蛙的跳跃能力是 y,它可以在每个区间内自由选择石头进行跳跃,而不会受到石头高度不足的限制。
-
4. 具体分析
-
青蛙的跳跃路径:
-
青蛙需要从起点跳到终点,再跳回起点,重复 x 次。
-
每次跳跃的距离不能超过 y。
-
-
区间的划分:
-
将河分成若干个长度为 y 的区间。
-
每个区间内的石头高度和必须≥2x,因为青蛙需要在这些区间内完成 2x2x 次跳跃。
-
-
石头高度的作用:
-
每块石头的高度 h[i] 表示这块石头可以被踩的次数。
-
如果某个区间的石头高度和<2x,那么青蛙在这个区间内无法完成 2x 次跳跃。
-
5. 举例说明
假设:
-
河的宽度 n=5。
-
需要去学校的天数 x=1,实际过河次数 2x=2。
-
石头高度 h=[3,1,2,1]。
跳跃能力 y=2:
-
区间划分:
-
区间 1: 位置 1 和 2,高度和 3+1=4≥2。
-
区间 2: 位置 2 和 3,高度和 1+2=3≥2。
-
区间 3: 位置 3 和 4,高度和 2+1=3≥2。
-
-
每个区间的石头高度和都 ≥2,因此青蛙可以完成 2 次跳跃。
跳跃能力 y=1:
-
区间划分:
-
区间 1: 位置 1,高度和 3≥2。
-
区间 2: 位置 2,高度和 1<2。
-
区间 3: 位置 3,高度和 2≥2。
-
区间 4: 位置 4,高度和 1<2。
-
-
存在区间的石头高度和 <2,因此青蛙无法完成 2 次跳跃。
6. 总结
-
对于一个跳跃能力 y,青蛙能够跳过河 2x 次,当且仅当对于每个长度为 y 的区间,这个区间内石头高度 h 的和都大于等于 2x。
-
这是因为青蛙的跳跃能力限制了它每次跳跃的距离,而石头的高度限制了它可以在每块石头上踩的次数。
-
如果某个区间的石头高度和不足2x,青蛙在这个区间内无法完成足够的跳跃次数。
-
如果每个区间的石头高度和都 ≥2x,青蛙可以在每个区间内自由选择石头进行跳跃,完成 2x次跳跃。
代码思路:
这段代码的目的是通过滑动窗口的方法,找到小青蛙的最小跳跃能力 y,使得它能够完成 2x 次往返跳跃。以下是代码的详细思路:
1. 输入处理
-
读取河的宽度 n 和需要去学校的天数 T:
-
使用
scanf("%d%d", &n, &T);读取输入。 -
河的宽度 n 表示从起点到终点共有 n 个位置(包括起点和终点)。
-
T 是小青蛙需要去学校的天数,实际过河次数是 2T(往返各一次)。
-
-
将 T乘以 2:
-
使用
T <<= 1;将 T左移一位,相当于 T=2T,表示实际过河次数。
-
2. 读取石头高度
-
读取每块石头的高度:
-
使用
for (int i = 1; i < n; i++) scanf("%d", &h[i]);读取每块石头的高度。 -
数组 h 的下标从 1 开始,表示从起点到终点之间的 n−1块石头的高度。
-
h[i]表示距离起点 i的位置的石头高度。
-
3. 滑动窗口寻找最小跳跃能力
-
初始化滑动窗口:
-
使用
for (int i = 1, j = 0, sum = 0; i < n; ++i)初始化滑动窗口。 -
i是窗口的左边界,表示当前跳跃的起点。
-
j是窗口的右边界,表示当前跳跃的终点。
-
sum 是窗口内石头高度的累加和。
-
-
扩展窗口的右边界:
-
使用
while (j < n && sum < T) sum += h[++j];扩展窗口的右边界。 -
不断将右边界 j向右移动,累加石头的高度,直到累加的高度 sum大于等于 T。
-
这一步的目的是找到一个窗口,使得窗口内的石头高度总和足够支持 2T 次跳跃。
-
-
记录窗口的长度:
-
使用
ans = max(ans, j - i + 1);记录当前窗口的长度。 -
窗口的长度 j−i+1表示当前跳跃能力 y。
-
通过取最大值,确保找到最小的跳跃能力。
-
-
缩小窗口的左边界:
-
使用
sum -= h[i];缩小窗口的左边界。 -
将左边界 i 向右移动,减去左边石头的高度,继续寻找更小的跳跃能力。
-
4. 输出结果
-
输出满足条件的最小跳跃能力:
-
使用
printf("%d\n", ans);输出结果。 -
ans 是满足条件的最小跳跃能力 yy。
-
代码的核心思想:
-
滑动窗口:
-
通过滑动窗口的方法,动态调整窗口的左右边界,找到一个最小的窗口长度 y,使得窗口内的石头高度总和至少为 T。
-
窗口的长度 y 表示小青蛙的跳跃能力。
-
-
跳跃能力的定义:
-
跳跃能力 y 表示小青蛙一次跳跃的最大距离。
-
通过滑动窗口找到的 y是最小的跳跃能力,使得小青蛙能够完成 2T 次跳跃。
-
代码的优化点:
-
滑动窗口的边界处理:
-
窗口的右边界 j 不能超过 n,否则会越界。
-
窗口的左边界 i 逐步向右移动,确保窗口长度最小。
-
-
时间复杂度:
-
滑动窗口的时间复杂度是 O(n),因为每个石头最多被访问两次(一次扩展右边界,一次缩小左边界)。
-
这种方法在 n≤10**5 的规模下非常高效。
-
总结:
这段代码通过滑动窗口的方法,高效地找到了小青蛙的最小跳跃能力 y,使得它能够完成 2T 次往返跳跃。滑动窗口的核心思想是动态调整窗口的左右边界,确保窗口内的石头高度总和满足条件,同时找到最小的窗口长度 y。
相关文章:
C/C++蓝桥杯算法真题打卡(Day3)
一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …...
【数据结构与算法】Java描述:第二节:LinkedList 链表
一、链表的概念与结构 1.1 概念: 通俗的来说,链表是由一个个结点连接起来的就叫链表。 1.2 结构: 链表存储的数据 在 物理上是不一定连续的,它是由前面链接后面,一个个连起来的。 二、Java底层的 LinkedList 2.1…...
LLM run
lmstudio lmstudio ollama ollama N 卡使用自带UI gpu加速推理 ,选择满足条件的, ds模型选择列表 https://ollama.com/library/deepseek-r1 a卡当前支持的显卡型号 I卡 gpu加速配置 2025.3 intel Official project optimization https://www.modelscope.cn/m…...
k8s面试题总结(十)
1.为什么HDFS不适合存储小文件? 元数据存储在NameNode内存中,一个节点的内存是有限的。存储大量的小文件会消耗过多的寻道时间 同等大小一个大文件的访问速度一定比多个小文件访问速度快 3.NameNode存储block的数量是有限的 比如你一个block元数据需要消…...
android中activity1和activity2中接收定时消息
android中activity1和activity2中接收定时消息 业务类 import java.util.Timer; import java.util.TimerTask;public class MyAnager {private MyAnager() {}private static MyAnager instance;//回调接口onRecvTaskpublic interface OnMsgListener {void onRecvTask(String a…...
Non-Homophilic Graph Pre-Training and Prompt Learning
Non-Homophilic Graph Pre-Training and Prompt Learning KDD25 #paper/⭐# 目的:对异配图进行prompt 方法 邻居节点的综合嵌入 s v 1 ∣ V ( S v ) ∣ ∑ u ∈ V ( S v ) h u ⋅ s i m ( h u , h v ) , \mathbf{s}_{v}\frac{1}{|V(S_{v})|}\su…...
Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!
Ollama 是一款开源的本地大语言模型(LLM)运行框架,用于管理和运行语言模型。具有以下核心特点: 开源可定制:采用 MIT 开源协议,开发者能自由使用、阅读源码并定制,可根据自身需求进行功能扩展和…...
unittest框架 核心知识的系统复习及与pytest的对比
1. unittest 介绍 是什么:Python 标准库自带的单元测试框架,遵循 xUnit 架构(类似Java的JUnit)。 核心概念: TestCase:测试用例的基类,所有测试类需继承它。 TestSuite:测试套件&a…...
vue面试宝典之二
39.vue2和vue3中源码是如何解析模版的 new vue()的时候实例化了类之后根据传进去的option进行模版的类型div还是text还是啥进行匹配,同时拿到节点的值进行绑定,比如正则匹配{{}}将匹配到的变量拿去跟option中的data查找到具体的值…...
ESLint 深度解析:原理、规则与插件开发实践
在前端开发的复杂生态中,保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具,其默认规则与插件能满足多数常见需求,但面对特定团队规范或项目独特要求,自定义 ESLint 插件便成为有力的扩展手段…...
洛谷P1091
题目如下 思路 谢谢观看...
随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)
随着自动驾驶技术的蓬勃发展,安全、高效的路径规划成为核心挑战之一。快速探索随机树(RRT)算法作为一种强大的路径搜索策略,为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…...
江科大51单片机笔记【9】DS1302时钟可调时钟(下)
在写代码前,记得把上一节的跳线帽给插回去,不然LCD无法显示 一.DS1302时钟 1.编写DS1302.c文件 (1)重新对端口定义名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;(2)初始化 因为…...
ssm_mysql_暖心家装平台
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...
一周学会Flask3 Python Web开发-SQLAlchemy简介及安装
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,…...
< 自用文儿 > DELETED 设置速读 in Ubuntu24
systemctl 和 DELETED: 配置文件: vi /etc/systemd/system/ DELETED.service [Unit] DescriptionV2Ray Service Documentation DELETED Afternetwork.target nss-lookup.target[Service] #Usernobody CapabilityBoundingSetCAP_NET_ADMIN CAP_NET_BIN…...
自动化同步多服务器数据库表结构
当项目每次进行版本升级的时候,如果在这次迭代中涉及表结构变更,需要将不同的生产环境下,都需要同步表结构的DDL语句,比较麻烦,而且还有可能忘记同步脚本,导致生产环境报错.... 该方案采用SpringBootMybat…...
深入理解 HTML 元素:构建网页的基础
在网页开发的领域中,HTML(超文本标记语言)犹如一座大厦的基石,支撑起整个网页的结构与内容呈现。而 HTML 元素,则是构成这座基石的基本单位。今天,就让我们一同深入探索 HTML 元素的奥秘。 HTML 元素的构成…...
黄昏时间户外街拍人像Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 黄昏时分有着独特而迷人的光线,使此时拍摄的人像自带一种浪漫、朦胧的氛围 。通过 Lr 调色,可以进一步强化这种特质并根据不同的风格需求进行创作。Lr(Lightroom)作为专业的图像后期处理软件,提供了丰富的调色…...
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 - 慧知开源充电桩平台
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 引言 OCPP作为开放协议,其核心价值在于平衡标准化与可扩展性。面对不同充电桩厂商的硬件差异、区域能源政策及定制化业务需求,OCPP通过**扩展点(Extension Points)…...
VHD2VL:破解硬件描述语言转换难题的开源解决方案
VHD2VL:破解硬件描述语言转换难题的开源解决方案 【免费下载链接】vhd2vl 项目地址: https://gitcode.com/gh_mirrors/vh/vhd2vl 在FPGA和ASIC设计领域,技术团队常常面临VHDL与Verilog两种硬件描述语言之间的转换挑战。当项目需要跨语言协作、工…...
AI智能体生态的包管理器:agenticmarket-cli 设计与实践
1. 项目概述:一个面向AI智能体生态的命令行工具如果你和我一样,长期在AI智能体(Agent)这个领域里折腾,那你肯定经历过这样的场景:为了测试一个最新的开源智能体框架,你需要先找到它的GitHub仓库…...
【实战指南】STM32CubeMX UART配置进阶:从阻塞到中断+DMA的高效数据通信
1. UART通信模式选择指南 第一次接触STM32的UART通信时,很多人都会纠结该用哪种模式。我在实际项目中尝试过所有模式,总结下来就是:没有最好的模式,只有最适合当前场景的模式。先说说三种典型场景: 调试打印࿱…...
百度网盘直链解析工具:告别限速,实现高速下载的Python解决方案
百度网盘直链解析工具:告别限速,实现高速下载的Python解决方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在数字资源共享日益频繁的今天ÿ…...
前端工程化实战:基于 Kelivo 模板的配置即代码与自动化工作流
1. 项目概述与核心价值最近在整理个人开发环境时,发现一个挺有意思的项目,叫Chevey339/kelivo。乍一看这个仓库名,可能有点摸不着头脑,但点进去之后,你会发现它是一个围绕特定开发工具或框架进行深度定制、优化和功能增…...
模拟电路布局优化:多智能体强化学习实践
1. 模拟电路布局优化的挑战与机遇在集成电路设计领域,模拟电路布局一直是个令人头疼的问题。作为一名从业十余年的模拟电路设计师,我深刻体会到传统布局方法在面对现代工艺挑战时的局限性。每次手工调整晶体管位置时,那种"差之毫厘&…...
基于Taotoken统一API开发支持多模型切换的智能对话应用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 基于Taotoken统一API开发支持多模型切换的智能对话应用 应用场景类,场景是开发一个需要支持用户自由选择或系统自动切换…...
Pandrator:基于Python的自动化内容生成与数据转换工具实践
1. 项目概述与核心价值最近在折腾一些自动化数据处理和内容生成的工作流,发现了一个挺有意思的开源项目,叫Pandrator。乍一看这个名字,可能会联想到“潘多拉”和“生成器”的结合,实际上它也确实是一个功能强大的内容转换与生成工…...
【最新 v2.7.1 版本安装包】OpenClaw 零基础无痛部署,无需命令零代码保姆级快速上手
OpenClaw(小龙虾)Windows 一键部署保姆级教程 | 10 分钟搭建专属数字员工【点击下载最新OpenClaw安装包】 前言 2026 年开源圈热门 AI 智能体 OpenClaw(昵称小龙虾),GitHub 星标突破 28 万,凭借本地运行 …...
AI智能体分类学:从原理到实践,构建高效Agent系统的设计指南
1. 项目概述与核心价值最近在折腾AI智能体(Agent)相关的项目,发现一个挺有意思的现象:大家聊起Agent,要么是“它能帮我写代码”,要么是“它能自动处理客服”,但很少有人能系统地说清楚ÿ…...
