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

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...