
蓝桥杯历年真题题解
ZZZWWWFFF_
这个作者很懒,什么都没留下…
展开
-
[蓝桥杯 2022 省 B] 统计子矩阵
下面我是利用了一点前缀和的思想进行处理,我枚举所有的点作为起点去求出所有可能的前缀和数组,然后每一个前缀和都是我们可能的矩阵,因此判断对应数组的值是否满足题意即可。即枚举所有可能的子矩阵,然后对符合要求的矩阵进行计数即可。该题第一思路是暴力解决。原创 2023-04-01 15:08:14 · 181 阅读 · 0 评论 -
[蓝桥杯 2017 省 B] k 倍区间(前缀和+优化)
根据上面的介绍,我们知道假设有m个前缀和满足除以K的余数相同,那么任意两个前缀和的差都能被K整除,所以K倍区间的个数就是,即m*(m-1)/2个。第一思路容易想到用前缀和数组,然后枚举可能出现的所有区间,对满足k倍区间的区间进行计数即可。我们将所有的前缀和sum[i]全部模上K,统计所有相同余数的个数。不过对于该题的数据范围而言,O(n^2)的时间复杂度必然不够。那么应该怎么优化呢?记得开long long。原创 2023-03-18 14:11:26 · 1176 阅读 · 3 评论 -
[蓝桥杯 2022 省 B] 扫雷(搜索)
即将当前节点先初始化为排雷火箭,然后遍历所有还未被引爆的地雷,如果某个地雷被当前地雷引爆了,就做个标记,同时将其作为下一节点。下面是使用栈去模拟这个过程的代码,本质上与DFS大差不差。第一思路比较容易想到的是使用搜索或者去模拟爆炸的过程。但是该方法时间复杂度为O(mn)只能拿到40分。原创 2023-03-16 12:13:36 · 351 阅读 · 0 评论 -
[蓝桥杯 2013 省 A] 大臣的旅费(树形DP/dijkstra)
根据题意我们易知只要x取得最大即可得到最大花费路费,因此该题便转换成求最大路径的问题了,下面我们选择使用堆优化的dijkstra进行解答(这里可以在存图时将所有权值变成负数,这样还是套用求最小路径的模板,但是却能用来求最大路径啦)该题依题意可以很容易判断出所给图是一颗最小生成树,不过下面这种做法与其没有太大关系。注意该算法不能通过所有样例。原创 2023-03-14 16:49:22 · 154 阅读 · 0 评论 -
不成熟的梦想家 (未熟 DREAMER)(差分)
该题题意上很明显出现了对一个一维数组的某一段区间加上某一个数的操作,容易想到使用差分解决(并且题目中计算魅力值的公式也暗示了差分的使用)值得注意的问题是,题目也强调可能需要使用longlong,记得用longlong。因此套用差分模板,然后计算魅力值即可。原创 2023-03-14 15:11:56 · 155 阅读 · 0 评论 -
[蓝桥杯 2017 国 C] 小数第 n 位(模拟/数论)
该题第一想法是想直接使用double进行数据的存储然后直接输出,实际上看到该题的数据范围就可以排除该方法了,double的精度根本不够!第二思路是想到去模拟除法的计算,只需不断地对a与b进行除法计算和取模计算即可(这点读者可以自行在纸上尝试)但是上面的代码在面对n特别大的时候会存在超时的情况,因此我们需要进行优化!这里我们利用数学知识进行优化,尽量地减少我们模拟的次数。原创 2023-03-11 12:28:56 · 184 阅读 · 0 评论 -
[蓝桥杯 2020 省 A1] 分配口罩
思路比较容易想到,因为口罩全部只有15批,因此直接暴力dfs搜索即可。原创 2023-03-09 19:01:54 · 203 阅读 · 0 评论 -
[蓝桥杯 2020 省 A1] 合并检测
下面我们以100个民众为例,分别计算k取不同值时所需的试剂盒总数。该题我的思路是枚举大部分可能的K,最后选出最小的那个即可。原创 2023-03-09 18:52:28 · 190 阅读 · 0 评论 -
[蓝桥杯 2020 省 A1] 跑步训练(模拟)
容易想到可以用每两分钟作为一个单位进行计算,但是认真重新思考,发现其实不然,因为可能你的体力只剩下400,此时体力>=300,按照上面的思路即分钟++,但是其实此时体力已经不足以支撑需要先消耗的600了,因此该思路是错误的。正确思路应该是在体力>600时去模拟跑步的过程,而体力原创 2023-03-09 18:42:35 · 216 阅读 · 0 评论 -
[蓝桥杯 2017 国 B] 发现环 (拓扑排序)
题目的意思还是比较好理解的,主要是涉及到图中环的判断问题。下面这里我使用的是拓扑排序进行解答。这里忘记的同学可以参考。原创 2023-03-08 20:40:23 · 245 阅读 · 0 评论 -
[蓝桥杯 2017 国 C] 合根植物 (并查集)
该题一眼并查集,直接套并查集模板即可。原创 2023-03-08 19:51:05 · 137 阅读 · 0 评论 -
[蓝桥杯 2022 省 B] 统计子矩阵 (前缀和)
这里假设以(1,1)点为起点求可能的所有子矩阵的和,我们定义一个数组temp[i][j]的值为(i,j)这个点到起点(x,y)所连成线的矩阵的权值(即矩阵内每个点的和),这里可以利用动态规划的思想,我们可以很容易想到tmep[i][j]=temp[i-1][j]+temp[i][j-1]-temp[i-1][j-1]容易知道这样的算法是时间复杂度是n^4的,不过该题的数据范围并不太大,因此还是能通过大部分样例。根据上面的思想,我们再枚举每一个点作为起点即可枚举出所有情况。注意要保证数组不要越界。原创 2023-03-08 19:14:27 · 410 阅读 · 0 评论 -
[蓝桥杯 2022 省 B] X 进制减法(贪心)
即理解:X进制数321为什么等于十进制数65?(其中3的进制为八进制,2的进制为十进制,1的进制为2进制)我们只需要在保证进制合法的情况下使得所有进制最小即可。明白了这一点其实就不难想到如何使得A-B最小。类比正常的进制数计算我们可以得到。该题首先关键的一点是理解题意。据此就可以写出代码了。原创 2023-03-07 15:33:34 · 1379 阅读 · 3 评论 -
城邦(最小生成树应用)
该题翻译过来就是:给定2021个顶点,请你使用2020条边将所有顶点进行连接,保证任意两个顶点之间可以有路径到达,同时保证使用边的权值之和最小。即先计算所有边的权值同时将它们保存在一个数组中对边的权值进行从小到大排序,然后从小到大选出边连接两个顶点,这里利用并查集实现判断是否形成回路。看到这里,如果你对最小生成树熟悉的话,那么不难想到该题是最小生成树的一道应用题。这里我选择使用克鲁斯卡尔算法进行解答。该题主要注意先好好理解题意。原创 2023-03-05 15:54:09 · 101 阅读 · 0 评论 -
Mzc和体委的争夺战(最短路)
这里我选择使用堆优化的dijkstra来解决。该题比较明显的是一道最短路径的题目。原创 2023-03-04 17:04:55 · 119 阅读 · 0 评论 -
Geodetic集合(最短路)
首先得到起点和终点之间的最短路径值是多少(这里我选择使用最朴素的dijkstra,该题数据量较小,实际上floyd都可以),再使用搜索从起点开始,使用一个栈存储路径,如果搜索到终点时的路径大小为前面所得的最短路径值的话就将得到了路径存储到set中,最后输出set即可。还是和上面思路一样我们需要得到起点到各个顶点之间的最短路径值,这时我们还需要终点到各个顶点之间的最短路径值,而判断某个点是否在最短路径上,我们只需判断是否 起点到该点的最短路径值+终点到该点的最短路径值==起点到终点的最短路径值 即可。原创 2023-03-04 16:32:47 · 122 阅读 · 0 评论 -
最小花费(最短路径)
首先需要清楚的是我们的建图,正常计算的话应该是沿着路径用100进行计算,例如走1->2->3的话,我们是(100/(1-2/100))/(1-1/100)=103.07153164。第一思路是想用搜索来做,直接DFS所有可能的情况,然后找到最小的即可,不过不能满足该题的时间复杂度。这样我们可以确定最后的答案是100/路径乘积。所以找到一条最大路径即可,即最短路径的反面。因此我们定义每一条边的权值为1-百分比。第二思路是使用dijkstra。原创 2023-02-28 16:53:20 · 278 阅读 · 0 评论 -
道路重建(最短路径)
这里可以使用floyd(该题数据量较小)或者是dijkstra进行解答。非常明显的最短路径题目,只不过该题是求路径上被损坏的权重之和。可以将未被损坏的边的权值都赋为0(不会影响最短路径的求取)下面给出floyd的代码(dijkstra思路一致)这里我们选择使用邻接矩阵进行存储图(方便后续)在上述基础上进行最短路径值的求取即可。而损坏的边的权值都赋值为应有的权值。原创 2023-02-28 15:07:46 · 244 阅读 · 0 评论 -
[蓝桥杯 2022 国 B] 出差(迪杰斯特拉)
该题非常明显是一道关于最短路径的问题,这里我想的第一个思路是使用floyd(因为容易),当然O(n^3)无法满足该题要求的时间复杂度。最好的做法还是使用迪杰斯特拉算法进行解答(下面只是使用朴素的迪杰斯特拉即可解决该问题)原创 2023-02-26 19:36:52 · 471 阅读 · 6 评论 -
[蓝桥杯 2022 国 B] 最大数字(贪心/搜索)
我们知道要想在有限的条件下使得一个数变大,那么我们肯定有限使其较大位数上的数字变大,而最大是9,所以问题就转换成如何使得一个数字的较高位得到更多的9。但是该方法不能通过所有样例,原因是当A和B较大时,如果有两种方法可以使得当前这一位最大,似乎就不好选择了。看到题目的问题问的是最大是多少,第一思路是想使用贪心进行解答。3)上述两种情况均不成立,选择尽量+1。1)能够通过加1到9。2)能够通过减1到9。原创 2023-02-26 16:20:26 · 378 阅读 · 0 评论 -
[蓝桥杯 2022 国 B] 卡牌(贪心/二分)
若大于,则证明空卡牌够用,但受可画的卡牌数的限制,卡牌套数只能为每张卡牌初始卡牌数与可画卡牌数的和的最小值。因为一套卡牌需要所有卡牌各一张,所以对于最少的卡牌,它如果只有 x 张,则只能有 x 套卡牌含有最少的卡牌。再多的其他卡牌就没用了,所以卡牌套数等于最少的卡牌牌数。还是根据卡牌套数等于最少的卡牌牌数,在空卡牌够用的情况下,最终的卡牌套数取决于初始卡牌数与可画卡牌数的和最少的卡牌。这里我选择从大到小遍历可能凑出的牌套数,计算凑出它需要补的牌数以及判断是否会超出能补的牌数。首先要理解一个东西,原创 2023-02-25 19:43:47 · 1840 阅读 · 0 评论 -
[蓝桥杯 2022 国 C] 斐波那契数组(枚举)
我们仔细读题不难发现,实际上由输入的数列变化得到的斐波那契数列必然是“起点”为1的斐波那契数列的倍数,那么,我们只需对比输入数列的每一个元素与“起点是1的斐波那契数列”的倍数关系,找到出现的倍数关系次数最多的数,此时将其他不是该倍数关系的数进行更改即可。即枚举每一个作为“起点”的元素构造一个斐波那契数列,之后对比输入的数列与枚举的数列中“区别最小”的情况,即可得到答案。但是该算法时间复杂度较高,无法通过全部样例。第一思路比较容易想到的是暴力算法。原创 2023-02-25 16:29:41 · 920 阅读 · 3 评论 -
[蓝桥杯 2022 国 C] 取模(数论/枚举)
我们可以使用一个容器存储每一个取模后的值,同时对每一个值进行计数,如果某一个取模值在容器中出现的次数出现了>=2次,我们就可以判断Yes。即:在【1,m-1】之间枚举每一个x,之后再枚举【x+1,m】之间枚举每一个y,分别计算得到它们与n的取模值,进行比较即可。上述思路还可以进行优化的一点是,我们不难发现当m较大时,必然输出Yes,因此我们选择在m>=30时必然输入Yes。这里的容器可以选择使用set或者是multiset的count函数(当然使用数组也可以实现)原创 2023-02-25 14:34:32 · 761 阅读 · 1 评论 -
[蓝桥杯 2020 省 AB3] 乘法表(模拟)
注意这里在等式的前后如果出现>=10的数字都需要用字母表示!原创 2023-01-14 16:20:25 · 399 阅读 · 0 评论 -
[蓝桥杯 2021 省 AB2] 完全平方数(数论)
这个定理简单来说就是对于任意一个数 n,它都可以分解为若干个质数的乘积。比如 60 就可以分解为 2^2 * 3 * 5。第一思路很容易想到,直接枚举[1,n]的所有数x,看是否x与n相乘的数字开平方后的temp乘temp是否等于原来的数即可。据此,我们只需要先对n进行质因数分解,然后补充进n的质因数的指数为奇数的哪些质因数即可。但是因为题目的最大时间复杂度是10^12,所以该方法还无法AC。如果一个数是完全平方数,那么这若干个质数的指数都一定是偶数。比如,36=4*9=(2^2*3^2)原创 2023-01-14 13:01:45 · 616 阅读 · 0 评论 -
[蓝桥杯 2022 省 B] 修建灌木(模拟)
很明显我们直接模拟这个过程即可,用一个数组记录树的每一天成长,另一个数组记录每棵树的最大值,不过这里值得注意的是,对于边缘树的情况讨论,我们通过对样例进行分析发现,实际上爱丽丝每次到左右端点都会进行停留一步进行掉头(也就是说,边缘的树会被修剪两次,当然除了第一天的情况)考虑右端点情况:对于第 i 棵树来说,它的高度其实就是爱丽丝离开这棵树的天数,即 2×(n−i)。因为要最高的长度,所以正解的算式为:max(n−i,i−1)×2。对于第 i 棵树来说,它离左端点的距离为 i-1。原创 2023-01-13 21:33:33 · 367 阅读 · 0 评论 -
[蓝桥杯 2022 省 A] 求和(前缀和)
但是我们可以做一点优化就可以解决问题了,仔细观察问题我们不难发现,就是每一个数字都去乘以排在它后面的数后相加,那么我们不难发现其实可以利用一下乘法分配律。其实也可以利用一下前缀和的思想。这样我们的代码就变成了。原创 2023-01-13 20:24:20 · 474 阅读 · 0 评论 -
[蓝桥杯 2019 省 AB] 完全二叉树的权值
【代码】[蓝桥杯 2019 省 AB] 完全二叉树的权值。原创 2023-01-13 17:16:35 · 294 阅读 · 0 评论 -
[蓝桥杯 2017 省 B] k 倍区间(前缀和枚举/数论优化)
继续看,在i=7时,S[i]=1又一次出现了,则表明在这个位置与其前面所有出现数字1的位置之间又能构成新的k倍区间(不包括前一个位置的那个值),比如区间[3,7](um[3,7]=4+7+3+1+6=21,21%3=0)是一个k倍区间;而实际上,我们一开始就忽略了区间[1,4](sum[1,4]=5+2+4+7=18,18%3=0)也是一个k倍区间,这样的忽略导致之后每出现一次数字0,就忽略一次。接着当i=5时数字0第2次出现,则表明此时区间[5,5](um[5,5]=3,3%3=0)是一个k倍区间?原创 2023-01-12 13:14:19 · 794 阅读 · 1 评论 -
[蓝桥杯 2016 省 AB] 四平方和(枚举/哈希)
我们可以分成两段进行枚举,先枚举所需的c和d,再以哈希的形式去枚举a和b进行对应,直到找到第一个与哈希对应的a和b(与前面一样因为都是从0开始枚举,所以第一个自然是最小的)枚举每一个需要的数字,直到找到满足条件的第一个答案输出即可(因为都是从0开始枚举,所以第一个自然是字典序最小的)该题看到时间限制是3s就确定可以使用暴力了。原创 2023-01-11 17:19:17 · 341 阅读 · 0 评论 -
[蓝桥杯 2015 省 B] 移动距离(模拟)
感觉做搜索题做多了,看到图就想搜索,这里我的第一思路是想先按照题目的要求构造出所需的图,再进行搜索(DFS/BFS)即可。得到两个点在图中的坐标其实就完全可以确定答案了,因为给定两个点(x1,y1),(x2,y2)你不管怎么走,肯定要向上走abs(y2-y1),肯定要向下走abs(x2-x1)查了相关资料发现这叫“曼哈顿距离”,是有公式的,感兴趣的读者可以自行查阅。我于是多举了几个样例进行分析,发现实际上该题很简单!给定一张图,求出其中某个点到某个点的最短移动距离。综上,代码就可以写了。原创 2023-01-11 12:27:57 · 305 阅读 · 0 评论 -
[蓝桥杯 2020 省 AB1] 解码(模拟)
遍历整个字符串,每次读取两个字符(第一个字符下标为index),如果第二个字符为数字则输出第一个下标字符对应次数遍,同时index+=2,反之正常输出字符后index++值得注意的是越界问题,由于每次读取两个字符,为避免越界,我们提前在字符串后面添加一个字符‘1’原创 2023-01-10 15:25:00 · 381 阅读 · 0 评论 -
[蓝桥杯 2014 省 AB] 蚂蚁感冒(模拟)
之后再更新每只蚂蚁的坐标/位置即可。如果碰面绝对有坐标相等的情况。原创 2023-01-10 13:31:24 · 153 阅读 · 0 评论 -
[蓝桥杯 2013 省 AB] 错误票据(模拟)
【代码】[蓝桥杯 2013 省 AB] 错误票据(模拟)原创 2023-01-10 12:00:37 · 281 阅读 · 0 评论 -
[蓝桥杯 2013 省 A] 剪格子(DFS)
下面是我看到的另外一篇比较好的题解,分享一下。原创 2023-01-06 12:38:00 · 262 阅读 · 0 评论 -
[蓝桥杯 2018 省 AB] 全球变暖(BFS/DFS)
这里我的第一思路是先使用搜索求(BFS/DFS)出所有的岛屿数量,同时在搜索过程中标记所有会被淹没的陆地的下标,搜索完毕后再把这些下标的陆地都变成海洋,再搜索整个图有多少个岛屿,最后前后求出的岛屿数相减就是答案。每次搜索岛屿时,检查是否存在上下左右都是陆地的元素,如果存在,那么这个岛屿就不会被淹没,计数,最后用原来的岛屿数减去不会被淹没的岛屿即可。错了,这里存在一个问题,是海洋有可能将未被淹没的岛屿给分隔开,即可能增加岛屿数量。我们上面的思路是找到被淹没的陆地,下面也可以找到不会被淹没的陆地。原创 2023-01-05 17:38:00 · 1172 阅读 · 1 评论 -
P8604 [蓝桥杯 2013 国 C] 危险系数(DFS)
给定一个无向图,给定起点和终点,问有多少个点删去之后使得起点和终点不连通,如果起点和终点本身不连通则输出-1。原创 2023-01-01 17:37:23 · 531 阅读 · 0 评论 -
P8605 [蓝桥杯 2013 国 AC] 网络寻路(DFS)
该题很明显(统计方案题),一眼考虑DFS,当结点数==4时,ans++但是要注意的是当结点数==3的时候需要特判一下起点等于终点的情况。给定一个 n 个节点,m 条边的无向图,没有重边和自环。从一个起点出发,经过两个结点,到达一个终点。定义一条合法的路径,应满足。原创 2023-01-01 13:35:36 · 842 阅读 · 0 评论 -
2021蓝桥杯省赛真题 最短路径
第一思路:我们依题意知道我们每次只能从自己的起点a走到前面的结点b,且a与b差的绝对值必须<=21,相当于我们每次最多前进21步,且需要花费a*b/gcd(a,b) (a与b的最小公倍数),那么我们只需要每次都遍历起点前面的21步,然后叠加前面21步中与起点的最小公倍数最小的数,同时更新起点为那个 最小公倍数最小的数 ,直到起点>=2021#include<iostream>#include<set>#include<vector>#incl...原创 2022-04-07 22:50:00 · 599 阅读 · 0 评论 -
2021蓝桥杯省赛真题 直线
思路上从“两点确定一条直线”出发,我们根据数学知识,由直线斜截式方程 y=kx+b 我们可以使用参数k 和参数b 来判断两条直线是否是同一条,进一步而言就是我们需要实现直线的去重,我们这里选择使用set容器进行去重,最后我们只需一边遍历所有可能的构成直线的点一边将{k,b}传入set即可(注意我们这里的斜率是建立在不等于0和存在的情况下,而直线斜率等于0和不存在的情况可自行手算有多少行和多少列即可)#include<iostream>#include<set>usi...原创 2022-04-07 21:15:52 · 462 阅读 · 0 评论