有一些知识点几乎必考,它们也是整个算法竞赛知识库的基础。
(1)杂题。不需要算法和数据结构,只需要逻辑、推理的题目,难度可难可易。考察思维能力和编码能力,只能通过大量做题来提高。
(2)BFS搜索和DFS搜索,也就是暴力搜索。这是非常基本的算法,是基础中的基础。
(3)动态规划。线性DP,以及一些DP应用,例如状态压缩DP、树形DP等。
(4)简单数学和简单数论。 如 最小公倍数、最大公约数
(5)简单的字符串处理、输入输出。
(6)基本算法,例如排序、排列、二分、倍增、差分、贪心。
(7)基本数据结构。队列、栈、链表、二叉树等。
蓝桥杯题目分为 填空题 和 编程题
注意: 填空题只输出结果,提交过程不得分!!!
语言基础:
输入输出: 推荐使用scanf / printf 格式化输入输出方便
正确解决一道题目的前提,是保证接收的数据是正确的。
接收字符串:
1. char s[10]; scanf("%s",s); 计算长度: len=strlen(s);
2. string s; cin>>s; 长度:len=s.length();
排序: 推荐使用库函数sort 头文件#include<algorithm>
O(nlogn) sort(begin,end,cmp); 可以首先cmp函数,请自行了解
其他常用的函数: max min
STL: 可以帮助你更容易地接收和处理数据
常用的有pair vector queue set map
具体了解函数应用在什么算法中,以及必备的方法
pair 数对 头文件utility 推荐写法 :typedef pair<int,int> PII;
vector 有序的容器 可以用来构建图,方便
queue 队列 用在BFS中
priority_queue 默认大根堆
map/set 去重,常与BFS用做优化。 (BFS+去重, DFS+剪枝)
基础算法:
时间复杂度
枚举: for 枚举所有可能的结果, 使用if可进行优化
应用: 日期问题,蓝桥杯中常考知识点
模拟
进制转换
前缀和: 用来进行算法优化
一维前缀和: sum[i]=sum[i-1]+a[i];
二维前缀和:s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]
贪心
二分:
整数二分模板
int l,r;
while(l<r){
mid=l+r>>1;
if(check(mid)) l=mid;
else r=mid-1;
搜索 : dfs搜all结果 bfs搜最优结果
dfs: 剪枝优化
void dfs(){
if() //收获结果
for(){
if() continue; //剪枝
//选择
dfs(); //递归
//回溯
}
}
// dfs 可以说是必考的, 难点在于如何设置条件,如何进行递归
bfs: 去重优化
void bfs(x){
queue<int> q;
q.push(x);
while(q.size()){
int t=q.front();
q.pop();
//操作...
}
}
经典应用: 八数码问题,从一个状态到另一个状态所需要最短步骤
map<string,int> mp; 使用mp去重优化 string用来存状态,int存操作步数
queue<string> q; //bfs必备队列
1 2 3
x 4 6 => "123x46758"
7 5 8
int bfs(s){
q.push(s);
mp[s]=0;
while(q.size()){
string t=q.front();
q.pop();
if(t==tar) return mp[t]; //找到目标,返回结果
int idx= t.find('.'); // 可移动的位置
int x=idx/3; int y=idx%3; //装换成
int temp=mp[t]; //保存移动次数
for(int i=0;i<4;i++){
int cur=(x+next[i][0])*3+(y+next[i][1]);
swap(t[cur],t[idx]);
if(!mp[t]) mp[t]=temp+1, q.push(t);
swap(t[cur],t[idx]); //回复状态,进行下一次查找
}
return -1;
}
待更 ------------- 正在学习的小白,感谢支持
动态规划
数论
基础数据结构:并查集 树上问题
图论: 存图 图的遍历 图的应用