第十一届蓝桥杯省赛第一场C++AB组真题
第十一届蓝桥杯省赛第一场C++A/B组真题
整除序列
有一个序列,序列的第一个数是
输入格式
输入一行包含一个整数
输出格式
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
数据范围
输入样例:
输出样例:
直接暴力模拟,没啥好说的
解码
小明有一串很长的英文字母,可能包含大写和小写。
在这串字母中,有很多连续的是重复的。
小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。
例如,连续的
对于这个例子:
为了方便表达,小明不会将连续的超过
现在给出简写后的字符串,请帮助小明还原成原来的串。
输入格式
输入一行包含一个字符串。
输出格式
输出一个字符串,表示还原后的串。
数据范围
输入字符串由大小写英文字母和数字组成,长度不超过
请注意原来的串长度可能超过
输入样例:
输出样例:
也是直接模拟即可
走方格
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第
现在有个人站在第
只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
输入格式
输入一行包含两个整数
输出格式
输出一个整数,表示答案。
数据范围
输入样例1:
输出样例1:
输入样例2:
输出样例2:
经典的摘花生、机器人走方格等
整数拼接
给定一个长度为
你可以从中选出两个数
例如
注意交换
请你计算有多少种拼法满足拼出的整数是
输入格式
第一行包含
第二行包含
输出格式
一个整数代表答案。
数据范围
$ 1 \le n \le 10^5
输入样例:
输出样例:
暴力
暴力是比较容易想的,二重循环,每次判断两个数拼接起来是否符合条件即可。显然复杂度达到了
优化
超时原因就是我们在确定一个数
本质上,本题就是求解A[i]
和A[j]
拼接后即(A[i]*10^len(A[j])+A[j])%k==0
,即符合上述等式的个数。
那么我们稍微移项一下化简为:(A[i]*10^len(A[i))%k==-A[j]%k
那么此时我们就可以发现,可以哈希记录答案个数了。
因此,创建一个二维数组cnt[i][j]
,这个数组就表示(A[j] 10 ^ i)% k == j的数量;
所以本题就转换为每次枚举一个Ai,然后计算出其%k的数来,然后再算出Ai的位数len.
然后去寻找cnt[len][Ai % k]
的大小,就能得知有多少个数满足条件,同时也就是答案数。
我们会发现有几个小问题和细节需要处理
- 我们一定要保持逻辑清晰,即首先是只枚举一遍
A[i]
,先不管对应的A[j]
是什么,对于每个A[i]
,都求A[i]*10^(len)%k,并记录结果,其中len是0~10。第二遍枚举A数组,其实是枚举的A[j]
,其对于每一个A[j]
,我们要看一下cnt[len(A[j])][(-A[j]%k+k)%k] 是多少并累加到答案中去。 - 当然这里我们发现等式的右侧是
-A[i]%k
显然会是负数,但我们还是要把这个结果映射为整数才能存在二维数组的第二维中,即答案加上k再Mod k。即(-A[i]%k+k)%k - 我们会发现上述操作,显然是没有考虑到A[i]和A[j]是不同的数(即
)。那么就需要在统计答案的时候,将同时选用A[i]和A[i]的情况去掉。其实并不是很复杂,即最后在统计答案的过程中,对于当前的A[j],求解一下A[j]*10^len(A[j])%k
是否等于(-A[j]%k+k)%k
,如果等于就说明取的两个数是同一个数,去掉即可。
暴力实现,过4个样例
哈希记录答案,优化
总结
- 还是先想朴素的做法,再看超时的原因卡在哪一步
- 这道题感觉就很经典,既然超时因为是我们在判断条件时想同时兼顾到
和 ,那必然就是 的复杂度。但是如果先只考虑 ,让 生成全部的可能并用哈希表记录,再只考虑 ,看前面生成的哪些是符合条件的。 - 这就非常巧妙地从“同时限制i和j”变成了“先只考虑i”,“再只考虑j的同时,去检查前面的i哪些合法”
网络分析
小明正在做一个网络实验。
他设置了
初始时,所有节点都是独立的,不存在任何连接。
小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信了。
两个节点如果存在网线连接,称为相邻。
小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。
所有发送和接收的节点都会将信息存储下来。
一条信息只存储一次。
给出小明连接和测试的过程,请计算出每个节点存储信息的大小。
输入格式
输入的第一行包含两个整数
节点从
接下来
- 如果操作为
1 a b
,表示将节点 和节点 通过网线连接起来。当 a = b 时,表示连接了一个自环,对网络没有实质影响。 - 如果操作为
2 p t
,表示在节点 上发送一条大小为 的信息。
输出格式
输出一行,包含
数据范围
$ 1 \le n \le 10000
输入样例1:
输出样例1:
并查集高级操作
这道题乍一看和食物链挺像,但我感觉区别还是比较明显的。食物链维护的是当前节点到父节点和根节点的距离,是维护边。
但这个题因为是对于某个节点,只要一发消息,所连通的节点都要收到消息,所以维护的是节点,不是边了。
超级胶水
迷惑性极强的问题,石子合并 很像。但仔细分析之后,发现是找规律问题,这也是给我一个警醒,要认真分析,多做数据模拟!!!
__EOF__

本文链接:https://www.cnblogs.com/sdnu-dfl/p/17241752.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】