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)…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...