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)…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
