花街四人组邂逅小梅兄妹
友友们好(^-^)🌹🌹🌹,我是杨枝,一枚在算法领域迈步的呆萌的博主呀~
目前还是一只纯纯的菜汪🐶。 典型的又菜又爱闹那种👀,做不好很多事,说不好很多话,写题还总不Ac😅,还在努力还在前进👣。
因为了,你们对我来说都是是独一无二的呀💓。在点开这篇文章的那一刻,我相信,我们之间相互需要彼此啦🌹🌹
时刻谨记:认真写算法,用心去分享。不负算法,不误卿。 感谢相遇(^㉨^)。
蓝桥杯的十种呼吸法是笔者结合自己的学习筛选出来的十个知识点。本着像看漫画一样了解算法原理。当日后自己确实遇到相关的习题了,可以再回头结合着我的题解报告来加深理解喔。
往期精彩
🔖蓝桥杯十大常见天阶功法——水之呼吸.壹之型.递归
🔖蓝桥杯十大常见天阶功法——虫之呼吸.贰之型.二分
💓关于蓝桥,关于专栏,关于建议,关于您🌹
最近和执梗博主一起运营了蓝桥杯31日冲刺打卡群(因为陆陆续续的加入不便于管理,现在闭群啦,hh~)。 说一下自己的主观感受吧,从小伙伴在群里的提问中,是可以感觉,存在一部分小伙伴对蓝桥竞赛、对如何系统的学习算法、对一些基础算法的概念以及oj是怎么测评的等等,是不太清楚的。 因为我自己也还是菜狗,思考问题的方式可能也不全面,思维也还在逐渐完善。这里了,结合自身情况,浅谈自己的拙见吧🌹🌹🌹 |
这里是我看到的一小部分现象,作为我不是乱说的支撑吧~
一、关于蓝桥
蓝桥是可爱的OI赛制,填空题是只要一个答案,可以本地编译器把跑结果了,然后直接输出这个结果就好,对了就得分。 对于编程题就是过样例,依据样例得分,出题人设置的样例都过了,那就满分。需要注意的是:你可以重复提交的,评判的结果是以最后一次提交结果为准。 |
我感觉比较重要的就是这些了,其他的,可以在参赛注意事项中了解到,我就不唠唠叨叨的赘述了
二、关于专栏
我自己在写的这个呼吸之法专栏是趁着看完鬼灭之刃漫画的劲儿,顺势将自己在acwing学算法,备赛蓝桥中看到常见知识点总结出来。 计划的是: 水之呼吸-壹之型-递归; 虫值呼吸-贰之型-二分; 炎之呼吸-叁之型-动态规划; 音之呼吸-肆之型-模拟; 霞之呼吸-伍之型-数论; 恋之呼吸-陆之型-双指针; 雷之呼吸-柒之型-搜索; 风之呼吸-捌之型-图论; 岩之呼吸-玖之型-贪心; 火之神乐-拾之型-高级数据结构。 初步是这种敲定的,可能存在微调,这些年蓝桥也不再是那么简单暴力了,要掌握的也就逐渐增加了。 至于写作风格,与壹之型的递归;贰之型的二分差不多,知识点加上历届真题中有代表性的。文章中真题的数量就取决于漫画吧,比如郭游篇有11集, 我这里就放了11道。 比较活泼,多图,自己也还在不断优化排版,最基本最基本来说,自己看了以后,我知道为什么要记录这个真题,可以很快的获取到它的考点是什么,需要掌握的技巧是哪些。 同时也想看我文章的小伙伴以及我自己,看着是舒服的,是没有视觉疲劳。 |
三、关于建议
假如您对蓝桥要考的算法有大致的知识框架了,自己也是练真题了,那我更建议您订阅我好兄弟执梗的文章。他更的每篇文章是一套蓝桥真题,对您更有帮助。 |
我把它主页放这里了:
执 梗 — 个人简介:生与夜叉,忠于桔梗,意为执梗。记录学习历程,分享心中所爱
假如您对蓝桥、对算法竞赛大致的考点不太熟悉,你可以跟着我这个博客学习,我自己用通俗易懂的话把知识点总结出来,同时放上一系列十分具有代表性的例题。 我自己的建议是先大致看一遍文章,心中有个印象就可以了,心中知道:有篇博客讲过这个知识点,还有很多真题。我今天刚好遇到这个真题了,结合着这位博主的题解和总结再理解一下这个知识点。 |
四、关于您
假如您在冲刺群了,希望跟着小伙伴们一起打卡,里面的讨论氛围真的很好了。倘若自己应该还有额外的练习,那么这个月150+ 的刷题量应该是有的,根据我了解的,省赛拿奖怎么都没有问题的啦~ 假如您有自己的集训队,这是最好的啦~,好好跟着训练😜 假如都没有,那就得对自己严格一些了,记住为学日进,相信乾坤未定🌹🌹🌹 |
好啦~正式进去花街,开始游郭篇的历练了
💓对模拟和枚举的认识
模拟其实是一个比较宽泛的概念了,一般来说,不是常规的最短路问题,比如它不是用动归规划解决的最优解,不是贪心,也不是最短路问题的时候,就可以考虑能否用模拟结合枚举进行解题。
枚举这个理念的出现倒是比较直接简单了,在认知中,就是循环嘛。
简单来说,也就是暴力嘛。这个了,确实是这么一回事儿。
可能人人都会写枚举,但不一定写出来的枚举就可以Ac。正是因为枚举的思想是挺直接简单的,所以枚举的考点放在了细节的处理上。
待会就系统结合的枚举的历年真题,切实的感受一下它的玩法,以及总结一些枚举中经常用到的小技巧和思考方向
枚举首先要考虑的是如何在遍历的途中,把咱们需要的答案查找出来。
既然是可以直接暴力获得部分的分,那么就可以通过题目中隐藏的信息进行优化的。
还有一个比较重要的知识是,如何通过给定的数据范围确定自己最多可以进行几重循环。这个我在壹之型中总结了。
因为没有模板,模拟的题了,要么都会,此时需要注意的是细节;要么都不会。
不像其他算法,比如,我忘记SPFA的模板怎么写了,执梗记得,那么我就没有这个分了。模拟说直白点了,确实就是循环,但是怎么循环也是一门学问了,看能不能get到题目中的隐藏的信息,以及处理好一些小技巧。模拟的题,细节是真的多。
💓一触即发
🌟第一话、第十届蓝桥杯省赛C++B组 特别数的和
这道题是热身的,就不存在特别需要注意的点啦~ |
进入题目描述环节
🌱题目描述
🌴解题报告
这个题算是枚举中相当乖的一道题了,读完题目以后,脑海中确实很难把它归纳到某一类专门的算法中,此时就乖乖的拿出我们的枚举大法吧。 |
解题思路:
枚举输入的范围内的中每一个数,然后将这个数,比如是39,用取模运算符和整除运算符将39中的每一位都取出来。
最后用语句 i f if if来判断是否含有 2 、 0 、 1 、 9 2、0、1、9 2、0、1、9这几个数字。
🌵参考代码(C++版本)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int res = 0;
for(int i = 1; i <= n;i++)
{
int x = i;
while(x)//当这个数还存在的时候,就持续取它
{
int t = x %10 ; //取出个位
x /= 10; //删掉x的个位
if(t == 2 || t == 0 || t == 1 || t == 9)
{
//将符合条件的数字累加起来
res += i;
break;
}
}
}
//输出结果
cout << res << endl;
return 0;
}
快乐迈入第二话
🌟第二话、第四届蓝桥杯省赛C++A/B组 错误票据
这道题最主要的思想是对于一串数据,可以先处理为字符串。那么此时就要考虑: 1、字符串的读入 2、怎么把字符串处理为其他类型的数据 |
🌱题目描述
🌴解题报告
这道题难度也是不大,将输入的 n n n行数据进行排序之后,再逐一枚举这 n n n个数。
如果相邻的两个数的数值相同,就是重号;如果相邻的两个数,数值只差大于等于2,比如 3 3 3和 5 5 5。那么就是断号
比较棘手同时也是需要掌握的是这道题的输入技巧。【重点】 |
1、掌握cin的读取原理:
当 cin读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。
一旦它接触到第一个非空格字符即开始读取,当它读取到下一个空白字符时,它将停止读取。
因为咱们要读取的这串数据中有太多空格,而且数量也是未知,所以cin和scanf都劝退
2、getline函数
为了解决这个问题,可以使用 getline 这个函数。它可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。
使用的语法如下:
getline(cin, inputLine);//其中 cin 是正在读取的输入流,而 inputLine 是 string 类型的变量,用于接收输入的字符串
//题目中的使用代码
getline(cin,line);
3、stringstream快速实现string类型和int类型之间的转换
< sstream > 定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、流的输出和流的输入输出操作。
🌵参考代码(C++版本)
#include <iostream>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = 10010;
int n;
int a[N];
int main()
{
int cnt;
cin >> cnt;
string line;
//第一个坑
getline(cin,line);//注意!这里用于忽略掉第一行的回车。引入输入cnt之后,是有一个回车的。要解决它
while(cnt--)
{
//正常的使用getline函数来读入
getline(cin,line);
//把line这个字符串中的信息,通过stringstream加载到ssin中
stringstream ssin(line);
//因为 stringstream是输入输出流,此时Ssin就可以像cin一样,将ssin中存储的信息,输入到数组a中
while(ssin >> a[n]) n++;
}
sort(a,a+n);
// for(int i = 0;i < n;i++) printf("%d",a[i]);
//输出效果如图,可以看到输入数据中的空格现在没有了:568991011127
int res1,res2;
for(int i =1;i < n;i++)
if(a[i] == a[i-1]) res2 = a[i];//重号
else if(a[i] >= a[i-1]+2) res1 = a[i]-1;//断号
cout << res1 << ' ' << res2 << endl;
return 0;
}
🌟第三话、第六届蓝桥杯省赛C++B组 移动距离
移动距离主要想让大家了解曼哈顿距离,其次是再次熟悉一下映射的思想。 |
🌱题目描述
🌴解题报告
这道题应该是可以用宽搜来做的,一题可以多解,但是打比赛的时候,找到一个对于自己而言,选择一个写起来简单,也不容易错的算法就好。
对于折线求最短路径,可以使用几何学中的曼哈顿距离进行求解。结合公式,只要知道两个位置的坐标,就可以快速算出距离。
曼哈顿距离概述:
曼哈顿距离的命名原因是从规划为方型建筑区块的城市(如曼哈顿)间,最短的行车路径而来。 |
曼哈顿距离的计算:
在平面上,坐标 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)的点 P 1 P_1 P1与坐标 ( x 2 , y 2 ) (x_2, y_2) (x2,y2)的点