第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(部分题解)
文章目录
- 前言
- 日期统计
- 题意:
- 冶炼金属
- 题意:
- 岛屿个数
- 题意:
- 子串简写
- 题意:
- 整数删除
- 题意:
- 总结
前言
一年一度的🏀杯马上就要开始了,为了取得更好的成绩,好名字写了下前年2023年蓝桥杯的省赛真题,感觉题目还不错(好难)为此来写篇博客重温一下这几个题。也可以帮助一下第一次参加蓝桥杯的新手小白更好冲击省一。
2023年的题目感觉比我们2024年的题目难(还好我不是去年参加的),不过🏀杯声名远扬,打打暴力可能就能获奖省一,从此成为同学眼中的“大神”。
只写了5个题,剩下的再看看。。。
日期统计
题意:

直接上图片吧,节省时间。
这题一看就非常简单了,毕竟作为第一题肯定不会太难。写出来第一题估计就能省三到省二区间了,大家也可以移步去看看。24年的第一题(更简单)
我们直接暴力打表,六七层循环跑出来,但是要注意其中的细节,这题就是考细节了。
代码就不展示了,好名字的代码找不到了,反正就是这样,然后再那样,相信你们都懂。
最后得到的答案是235。
这题so easy ,必须确保拿下。
冶炼金属
题意:


这是一个数学+二分的题目。我们可以知道
75 ➗ 20 = 3 75➗20=3 75➗20=3
75 ➗ 21 = 3 75➗21=3 75➗21=3
75 ➗ 22 = 3 75➗22=3 75➗22=3
。。。看下来我们可以知道75除以一个区间的数字都是可以等于3,所以对于每一组数据,我们都有一个区间的值符合要求,那么我们可以求出来每一个数据的区间,最后对他们取∩,我们就可以得到最小值,再进行一次取∩我们可以得到最大值。这是二分答案的写法。不会二分答案的同学,可以移步这里。
我看有人用数学的方法也可以写,这里就不做演示了。
这个题在我去年打蓝桥杯的时候就写过博客,大家可以进我主页看看。给朱波点点关注
int n;
vector<int>a,b;void Solve () {cin>>n;a.resize(n+1);b.resize(n+1);//vector容器的重构大小for (int i=1;i<=n;i++) {cin>>a[i]>>b[i];}int left =-1e9,right=1e9;for (int i=1;i<=n;i++) {int l = 1,r = 1e9;while (l<r) {int mid = l+r>>1;if (a[i]/mid<=b[i]) r = mid;else l = mid+1;}left = max(left,l);}for (int i=1;i<=n;i++) {int l = 1,r = 1e9;while (l<r) {int mid = l+r+1>>1;if (a[i]/mid>=b[i]) l = mid;else r = mid-1;}right = min(right,l);}//两次二分cout<<left<<' '<<right;return ;
}
这题可以搞,easy。
岛屿个数
题意:


大眼一看主播就知道这是一个搜索题,不过子岛屿的存在让主播有些许的头疼,不过利用瞪眼法我们可以知道,如果一个岛屿外面的海洋是公共的海洋,那么这个岛屿就没有被包围,这个岛屿就不是子岛屿。
所以,我们可以先DFS一遍外海洋,全部标记一遍,再利用这类题的传统解法。⚠️我们题目给出的边界之外全部都是海洋,所以我们可以自己处理一下,像这样

然后附上代码
char a[100][100];
int n,m;
int dx[]={0,0,1,-1,-1,1,-1,1},dy[]={1,-1,0,0,1,1,-1,-1};
int vis1[100][100],vis2[100][100];
int f = 0;
void dfs1 (int x,int y) {for (int i=0;i<8;i++) {int nx = x+dx[i],ny = y+dy[i];if (nx<0||nx>n+1||ny<0||ny>m+1||vis1[nx][ny]||a[nx][ny]=='1') continue;vis1[nx][ny] = 1;dfs1(nx,ny);}
}void dfs2 (int x,int y) {for (int i=0;i<4;i++) {int nx = x+dx[i],ny = y+dy[i];if (nx<0||nx>n+1||ny<0||ny>m+1||vis2[nx][ny]) continue; if (vis1[nx][ny]==1) f =1; if (a[nx][ny]=='1'){vis2[nx][ny] = 1;dfs2(nx,ny);} }
}void Solve () {cin>>n>>m;memset(vis1,0,sizeof vis1);memset(vis2,0,sizeof vis2);for (int i=1;i<=n;i++) {for (int j=1;j<=m;j++) {cin>>a[i][j];}}for (int i=0;i<=n+1;i++) {for (int j=0;j<=m+1;j++) {if (i==0||i==n+1||j==0||j==m+1) a[i][j] = '0';}}vis1[0][0]=1;dfs1(0,0);int ans = 0;for (int i=1;i<=n;i++) {for (int j=1;j<=m;j++) {if (a[i][j]=='1' && vis2[i][j]==0) {vis2[i][j]=1;f = 0;dfs2 (i,j);if (f) {ans++;}}}}cout<<ans<<'\n';return ;
}
注意记得初始化,主播因为没有初始化一开始,看了半天不知道哪里出错了,这是个多实例!!!
这个题也不难,不过OI赛制下可能写搜索题可能不太友好。说不定就差一个字母,这个题都没分。
子串简写
题意:


这一题找有多少符合条件的子串,并且要求这个子串的长度不能小于k,这个子串的首尾两个字母要和样例给出的一样,我们发现当我们在某处符合条件再往后找的时候,但凡出现字符b都是符合条件的。
举个例子:
首字母为a,尾字母为b,长度为4)
adcb这个答案显然为1
adcbb这个就是2
adcbbbbb这个就是5
aadcbbbbb这个就是10
我们可以看出,这显然和前缀和有关,所以我们思考一下,就可以知道,这个和前缀和其实没啥关系,但是和后缀和关系就大了,我们对串预处理一下,出现b的位置标为1,否则就是0。
然后用后缀和相加起来,我们可以输出一下这个后缀和看下,以样例为例
4 4 3 3 2 2 1 1
而后我们遍历这个串,从出现a的位置往后找k位,用后缀和快速找到后面有多少b,就是这个位置往后有多少符合条件的解,最后全部加起来就是答案。
void Solve () {int k;cin>>k;string s;cin>>s;s = " "+s;int t = s.size();vector<int>x(t+2);char a,b;cin>>a>>b;for (int i=1;s[i];i++) {if (s[i]==b) x[i] = 1;else x[i] = 0;}for (int i=t-1;i>=1;i--) {x[i] = x[i+1]+x[i];}int ans = 0;for (int i=1;i<s.size()-k+1;i++) {if (s[i]==a) {ans+=x[i+k-1];}}cout<<ans<<'\n';return ;
}
这个题赛时可以全写完,不难。
整数删除
题意:


这一题真的是挺不容易的,难度我觉得在CF1400+,主要就是对于小根堆的处理。不知道大小根堆的人有难了。还是去看下大小根堆的介绍理解一下吧。
每次删除一个最小数,我们很容易就能想到是小根堆的利用,但是本题会让其他数字也发生变化,我们又不能对于小根堆里面的数字进行更改,怎么办呢?
不能改我们就不改了嘛,我们用一个数组存一下每个位置改变的值,当要删除这个数字的时候,看看你会不会被前面删除的数字影响,就比如1,2,3我们先删除1,那么下一个2就会受影响变成3。同时如果是2 1 3的话,我们删除1,这时2的右领居和3的左领居就会发生变化,我们下次变化的时候就要进行调整。
所以我们要对于每一个数字的左右领居进行维护,然后用一个cnt数组记录每个位置的变化情况。
最后对于小根堆不停的删除最小的数字,当这个即将删除的数字会被之前的删除的数字影响,我们就push这个数字加上cnt的值放进小根堆里面。(小根堆还会自动排序,太好用了!)再进行判断。
最后输出就行了,看下代码。
priority_queue<PII,vector<PII>,greater<PII>>q;//用pair开小根堆记录这个值,和位置
void Solve () {int n,k;cin>>n>>k;vector<int>l(n+10),r(n+10);for (int i=1;i<=n;i++) {int x;cin>>x;q.push({x,i});l[i] = i-1;r[i] = i+1;}vector<int>cnt(n+10,0); while (k--) {int x = q.top().fi;int id = q.top().se;q.pop(); if (cnt[id]) {q.push({x+cnt[id],id});k++;//重新放进去再进行判断,所以k++cnt[id] = 0;}else {int le = l[id],ri = r[id];cnt[le] += x;cnt[ri] += x;r[le] = ri; l[ri] = le;//变化id这个位置的左右邻居}}map<int,int>mp;while (q.size()) {int x = q.top().fi;int y = q.top().se;q.pop();mp[y] += (x+cnt[y]);}for (auto t : mp) cout<<t.se<<' '; return ;
}
注意数组要开大一点,不然就会像我一样WA好几发(蓝桥杯赛场就炸缸了)
感觉这一题挺好的,可以细细斟酌一下。
总结
蓝桥杯不用想着把正解搞出来,其实暴力跑跑已经可以超过绝大部分人了(在弱省),好好备战,补药让300块打水漂。
相关文章:
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(部分题解)
文章目录 前言日期统计题意: 冶炼金属题意: 岛屿个数题意: 子串简写题意: 整数删除题意: 总结 前言 一年一度的🏀杯马上就要开始了,为了取得更好的成绩,好名字写了下前年2023年蓝桥…...
C语言常见3种排序
主要是三种排序方法:冒泡排序、选择排序、插入排序。 文章目录 一、冒泡排序 1.代码: 2.工作原理: 3.具体过程: 二、选择排序 1.代码 2. 工作原理 3.具体过程: 三、插入排序 1.代码 2.工作原理 3.具体过程 总结 一、…...
分析sys高问题的方法总结
一、背景 sys高的问题往往属于底层同学更需要关注的问题,sys高的问题往往表现为几种情况,一种是瞬间的彪高,一种是持续的彪高。这篇博客里,我们总结一下常用的分析方法和分析工具的使用来排查这类sys高的问题。 二、通过mpstat配…...
智谱发布AI Agent“AutoGLM沉思”,开启AI“边想边干”新时代
近日,智谱正式推出全新AI Agent产品——AutoGLM沉思,标志着人工智能从“思考”迈向“执行”的关键突破。该智能体不仅具备深度研究能力,还能自主完成实际操作,真正实现“边想边干”的智能化应用。 在演示环节,智谱展示…...
使用Leaflet对的SpringBoot天地图路径规划可视化实践-以黄花机场到橘子洲景区为例
目录 前言 一、路径规划需求 1、需求背景 2、技术选型 3、功能简述 二、Leaflet前端可视化 1、内容布局 2、路线展示 3、转折路线展示 三、总结 前言 在当今数字化与智能化快速发展的时代,路径规划技术已经成为现代交通管理、旅游服务以及城市规划等领域的…...
【小兔鲜】day02 Pinia、项目起步、Layout
【小兔鲜】day02 Pinia、项目起步、Layout 1. Pinia2. 添加Pinia到Vue项目3. 案例:Pinia-counter基础使用3.1 Store 是什么?3.2 应该在什么时候使用 Store? 4. Pinia-getters和异步action4.1 getters4.2 action如何实现异步 1. Pinia Pinia 是 Vue 的专…...
PyTorch 激活函数
激活函数是神经网络中至关重要的组成部分,它们为网络引入了非线性特性,使得神经网络能够学习复杂模式。PyTorch 提供了多种常用的激活函数实现。 常用激活函数 1. ReLU (Rectified Linear Unit) 数学表达式: PyTorch实现: torch.nn.ReLU(inplaceFals…...
魔塔社区使用llamafactory微调AI阅卷试题系统
启动 LLaMA-Factory 1. 安装 LLaMA-Factory 执行安装指令 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e ".[torch,metrics]"解决依赖冲突 如果遇到依赖冲突,可使用以下命令安装,不…...
Java面试黄金宝典29
1. 什么是普通索引和唯一性索引 定义: 普通索引:是最基本的索引类型,它为数据表中的某一列或多列建立索引,以加快数据的查询速度。它不限制索引列的值重复,允许存在多个相同的值。唯一性索引:在普通索引的基…...
git `switch` 命令详解与实用示例
文章目录 git switch 命令详解与实用示例git switch vs git checkoutgit switch 用法1. 切换到已有分支2. 创建并切换到新分支3. 切换到上一个分支4. 切换到远程分支(自动创建本地分支并追踪远程)5. 放弃未提交的修改并切换分支 总结 git switch 命令详解…...
Oracle中文一二三四排序【失败】
原文地址: Oracle数据库如何对中文的一二三四五六七八九十数进行正序排列排序_中文数字排序-CSDN博客 自定义排序函数 -- 自定义中文映射阿拉伯数字函数 CREATE OR REPLACE FUNCTION P_ORDER_CHINESE_TO_ARABIC(V_NUM VARCHAR2) RETURN NUMBER IS BEGIN-- 根据…...
AWS S3 和 Lambda 使用
目录: AWS概述 EMR Serverless AWS VPC及其网络 关于AWS网络架构的思考 AWS S3 和 Lambda 使用 本文将通过一个实例来说明如何使用 AWS S3 和 Lambda。 使用场景:通过代码将文件上传到S3,该文件需要是公开访问的,并对上传的文件进…...
Mysql 在什么样的情况下会产生死锁?
在 MySQL 中,死锁是指两个或多个事务相互等待对方释放锁,导致所有相关事务无法继续执行的情况。死锁会影响数据库的并发性能,因此需要及时检测并处理。假设有两个事务 T1 和 T2: 事务 T1 首先锁定 表 A 的行 1。然后尝试锁定 表 B…...
符号秩检验
内容来源 非参数统计(第2版) 清华大学出版社 王星 褚挺进 编著 符号秩检验 在符号检验的基础上,增加了数据绝对值大小的信息 检验统计量 用一个简单的例子来说明 样本数据 X i , i 1 , ⋯ , 6 X_i,i1,\cdots,6 Xi,i1,⋯,6 如下 X …...
RainbowDash 的 Robot
H RainbowDash 的 Robot - 第七届校赛正式赛 —— 补题 题目大意: 给一个 n ∗ m n*m n∗m 的二维网格,在第 i i i 列中,前 a i a_i ai 单元格被阻断,无法通行,即 [ 1 , a i ] [1,a_i] [1,ai] 。 一个机器人正…...
yum repolist all全部禁用了 怎么办
文章目录 步骤思考解决yum仓库全部被禁用的问题步骤思考: 检查仓库状态:运行yum repolist all,查看所有仓库的启用状态。 被禁用的仓库会显示为disabled。 启用所有仓库:可以逐一启用,或者使用命令批量启用。 例如使用yum-config-manager --enable ‘*’,但需要注意是否有…...
SQL WHERE 与 HAVING
WHERE 和 HAVING 都是 SQL 中用于筛选数据的子句,但它们有重要的区别 WHERE 子句 在 分组前 过滤数据 作用于 原始数据行 不能使用聚合函数 执行效率通常比 HAVING 高 SELECT column1, column2 FROM table WHERE condition; HAVING 子句 在 分组后 过滤数据 …...
如何在 Unity3D 导入 Spine 动画
一、前言 《如何在 Unity3D 项目中导入 Spine 动画》,虽然在网上有很多这种文章,直接将问题交给 DeepSeek 也能得到具体的操作流程,但是照着他们提供的方法还是能遇到几个问题,比如: AI 回答没有提到 Unity 无法识别.…...
子网划分2
子网分配的问题,下列vlsm如何设置? 某公司申请了一个C类202.60.31.0的IP地址,要求设置三个子网,一个为100台主机,一个为50台主机,另一个为50台主机,用VLSM如何设置? 哪位高手指教一…...
C++的UDP连接解析域名地址错误
背景 使用c开发一个udp连接功能的脚本,可以接收发送数据,而且地址是经过内网穿透到外网的 经过 通常发送数据给目标地址,需要把目的地址结构化,要么使用inet_addr解析ip地址,要么使用inet_pton sockaddr_in target…...
23种设计模式中的观察者模式
定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。 观察者模式是一种发布-订阅模式。它让发送通知的一方(被观察者)和接收通知的一方(观察者)能够解耦…...
论文笔记:ASTTN模型
研究现状 现有研究大多通过分别考虑空间相关性和时间相关性或在滑动时间窗口内对这种时空相关性进行建模,而未能对直接的时空相关性进行建模。受最近图领域Transformer成功的启发,该模型提出利用局部多头自关注,在自适应时空图上直接建立跨时…...
Java单例模式详解
单例模式详解 一、单例模式概述 单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。 核心特点 唯一实例:保证一个类只有一个实例存在全局访问:提供统一的访问入…...
Linux命令-tar
tar 命令的完整参数列表: 参数 描述 -c 创建新的归档文件 -x 解压归档文件 -t 列出归档文件内容 -r 追加文件到归档文件 -u 更新归档文件中的文件 -d 从归档文件中删除文件 -f 指定归档文件的名称 -v 显示详细信息(verbose) -z 使用 gzip 压缩…...
深入解析 Git Submodule:从基础到高级操作指南
深入解析 Git Submodule:从基础到高级操作指南 一、Git Submodule 是什么? git submodule 是 Git 提供的一个强大功能,允许在一个 Git 仓库(主仓库)中嵌入另一个独立的 Git 仓库(子模块)。主仓…...
2025-4-2 蓝桥杯刷题情况(分布式队列)
1.题目描述 小蓝最近学习了一种神奇的队列:分布式队列。简单来说,分布式队列包含 N 个节点(编号为0至N-1,其中0号为主节点),其中只有一个主节点,其余为副节点。 主/副节点中都各自维护着一个队列,当往分布式队列中添加…...
C/C++指针核心难点全解析:从内存模型到实战避坑指南
引言:指针为何被称为C/C的“灵魂”? 指针是C/C语言中最强大的工具之一,也是开发者通往底层编程的必经之路。它直接操作内存地址的能力,赋予了程序极高的灵活性和性能优势。然而,指针的复杂性也让无数初学者“折戟沉沙…...
ray.rllib-入门实践-12-2:在自定义policy中注册使用自定义model(给自定义model新增参数)
建议先看博客 ray.rllib-入门实践-12-1:在自定义policy中注册使用自定义model , 本博客与之区别在于可以给自定义的 model 新增自定义的参数,并通过 config.model["custom_model_config"] 传入自定义的新增参数。 环境配置…...
【Java中级】10章、内部类、局部内部类、匿名内部类、成员内部类、静态内部类的基本语法和细节讲解配套例题巩固理解【5】
❤️ 【内部类】干货满满,本章内容有点难理解,需要明白类的实例化,学完本篇文章你会对内部类有个清晰的认知 💕 内容涉及内部类的介绍、局部内部类、匿名内部类(重点)、成员内部类、静态内部类 🌈 跟着B站一位老师学习…...
swift-7-汇编分析闭包本质
一、汇编分析 fn1里面存放的东西 func testClosure2() {class Person {var age: Int 10}typealias Fn (Int) -> Intvar num 0func plus(_ i: Int) -> Int {num ireturn num}return plus} // 返回的plus和num形成了闭包var fn1 getFn()print(fn1(1)) // 1print(fn1(…...
