当各位小伙伴们看到这篇文章的时候想必蓝桥杯也快开赛了,那么本篇文章博主就来总结一下一些蓝桥杯的应赛技巧,那么依旧先来走个流程

那么接下来我们分成几个板块进行总结
首先是一些基本语法
编程语言的基本语法
首先是数组,在存数据的时候,建议先从1开始存,为啥这么干呢,博主在刷题的过程中有几次因为下标从0开始存,导致最后在理解上出现了一些不必要的麻烦。这里我有必要说一下蓝桥杯第十五届回文数组这题,当时就是因为数据从0开始存导致在理解上绕了好大的弯才想明白。
其次是指针,对于大一的小伙伴们或许还是用当初那个模板------类型 *指针名,不用想这么复杂,直接用数组的下标代替即可,我们需要将指针作为一个思维而非死用模板。
最后是设置类型上,建议各位小伙伴直接使用long long 类型,这样可以避免出现一些数据因为类型范围小而溢出,从而出现一些麻烦
那么接下来就到了编程的技巧板块
填空题技巧
技巧一:巧用excel
参考例子:蓝桥真题讲解-CSDN博客
技巧二:巧用python
其实博主不太推荐技巧二,因为赛场上不一定有pycharm,看情况而定吧
编程技巧
取出一个整数中的某个位的数(个位,十位,百位,千位)
cpp
While(条件)
{
tmp %= 10;
Tmp /= 10;
}
这个不建议大家直接当成模板背,建议去理解,而且理解起来也很轻松,当然对于大一只想拿个省奖的同学还是可以考虑记一下的
将某些数存放进哈希表
cpp
for(int i = 0; i < n; i++)
{
tmp = 数组名[i]
hash[tmp] = tmp;
}
经过博主多次考虑决定将之前的模板改成了这个,毕竟是帮助大家,而不是给大家制造麻烦,当然也建议大家先去试试,有问题就在评论区留言,注意哈!这是c++才能用的哦,c语言用了,并且出问题,博主可不背锅哈!
哈希表统计数
举两个例子
非字母的统计

字母的统计
hash[数组名[i] - a]
已经掌握哈希的小伙伴,请忽略这两点
定义变量时的类型
定义变量时用的类型建议直接用long long 类型(即长整型),并且代码中所有变量的类型都保持一致,这样可以避免因超出范围而出现的bug的麻烦
二维数组的坑
二维数组不能开太大,并且vector<vector<int>>类型的也是一样不能开太大,怎么判断自己是否开太大了呢?博主是这么认为的,超过10000的就已经很大了,当然有不同看法的小伙伴欢迎评论区留言,我们可以相互交流一下
数组的创建与传参
一维数组的定义:类型 数组名[ 元素个数 ] eg.int arr[10];(用这个也ok),最好放在main函数和其他函数的外面(也就是作为全局变量)
二维数组的定义:类型 数组名[ 行 ][ 列 ]
传参:
一维数组:
形参部分:类型 函数名(类型 数组名[数组大小])
实参部分: 函数名(数组名,其他参数)
二维数组:
形参部分:类型 函数名(类型数组名[行][列])其中行可以省略,列不可以省略
实参部分: 函数名(数组名,其他参数)
涉及排序
那么为了避免出现一些不必要的bug,我们可以直接使用sort容器对元素进行排序,那么以下是sort容器的使用模板
sort(数组名【起点位置】, 数组名 + 长度【终点位置】);
sort(数组名【起点位置】, 数组名 + 长度【终点位置】, 函数名);
第二个模板是需要我们自己再写一个函数,并且只要写如何排序即可
举个例子
cpp
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
struct node
{
int x, y, z;
int xw, yw, zw;
}a[N];
bool cmp1(node a, node b)
{
return a.xw > b.xw;
}
bool cmp2(node a, node b)
{
return a.yw > b.yw;
}
bool cmp3(node a, node b)
{
return a.zw > b.zw;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n = 0;
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i].x;
for(int i = 1; i <= n; i++) cin >> a[i].y;
for(int i = 1; i <= n; i++) cin >> a[i].z;
for(int i = 1; i <= n; i++)
{
a[i].xw = a[i].x - a[i].y - a[i].z;
a[i].yw = a[i].y - a[i].x - a[i].z;
a[i].zw = a[i].z - a[i].y - a[i].x;
}
long long xv = 0, yv = 0, zv = 0, x_ans = 0, y_ans = 0, z_ans = 0;
sort(a + 1, a + 1 + n, cmp1);
long long i = 1;
xv += a[1].xw;
while(i <= n && xv > 0)
{
i++;
xv += a[i].xw;
x_ans++;
}
sort(a + 1, a + 1 + n, cmp2);
i = 1;
yv += a[1].yw;
while(i <= n && yv > 0)
{
i++;
yv += a[i].yw;
y_ans++;
}
sort(a + 1, a + 1 + n, cmp3);
i = 1;
zv += a[1].zw;
while(i <= n && zv > 0)
{
i++;
zv += a[i].zw;
z_ans++;
}
if(xv >= 0 && yv >= 0 && zv >= 0) cout << -1;
else cout << max(x_ans, max(y_ans, z_ans));
return 0;
}
当然仅供参考
选自蓝桥杯三国游戏
拓展:
如果使用了数据结构,如vector
那么上面的模板就得变成下面的
sort(对象名.begin(), 对象名.end());
sort(对象名.begin(), 对象名.end(), 函数名);
去重容器
定义:set<int,int> 对象名
使用案例(仅供参考)
cpp
#include<iostream>
#include<bits/stdc++.h>
#include<string>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
set<int> q;
string s, s2;
cin >> s;
while(true)
{
for(int i = 1; i < s.size() - 1; i++)
{
if(s[i] == s[i - 1] && s[i] != s[i + 1])
{
q.insert(i);
q.insert(i + 1);
}
if(s[i] == s[i + 1] && s[i] != s[i - 1])
{
q.insert(i);
q.insert(i - 1);
}
}
if(q.empty())
{
cout << s;
break;
}
s2.clear();
for(int i = 0; i < s.size(); i++)
{
if(q.find(i) == q.end()) s2 += s[i];
}
s = s2;
q.clear();
if(s.size() == 0)
{
cout << "EMPTY";
break;
}
}
return 0;
}
选自蓝桥杯消除游戏
数据交换
第一种交换方式
tmp = a;
a = b;
b = tmp;
第二种交换方式
a = a ^ b;
b = a ^ b;
a = a ^ b;
第三种交换方式
swap(a,b);
注意:swap是一个库函数,并且c++才能使用!!!
感觉有思路,但又不确定怎么写
这种情况,我们先不管那些细节问题,如变量声明,循环条件是什么,先写出一个大概,将大概的代码写完后再去补细节
几个经典bug
使用各语言对应的输出语句进行输出某个过程中的数据
案例1
因为少写了什么代码导致最后的结果与预期不同

就比如这题,预期答案是58,但是实际输出是2,那么如何找到这个问题呢

在sum += judge(......)这行代码的后面,编写输出语句,再次执行程序,我们可以发现它还是只输出了2

那么还是给大一的小伙伴说一个知识点:如果是正常的for 按理说是不会只输出一个sum的值(在无特殊情况下),为了让这个bug出现得更明显一点,我们还可以在small[x][y]那段代码后面加输出语句,如下图

那么就可以确定这里是有bug的,那么接下来回到我们一开始的代码原理图上

结合原理图和自己所编写的代码我们可以发现,两层for循环只走了了一次(这里是靠走读代码的技巧,怎么走读下面会讲)原因是少了'=',那么问题来了,为啥会出现二呢?因为下面还有个judge函数,并且我们传过去的参数有数组名和a,b两个变量,进入到judge函数后又会根据我们所写的执行,所以才会出现2
案例2
在本地能通过,在云端通不过

那么出现这种情况,我们可以优先考虑是否出现数组越界的问题,如上图就很明显,条件限制的是i,但对i + 1却没有限制导致出现一个越界,此外i从0开始,导致i - 1越界,因此使得本地能通过,而云端通不过。
案例3

如图所示,这个bug在devc++中表示命名冲突,解决方法:更改一下a和b这两个变量的名字即可
题型模板
动态规划
题型特征
背包问题,路径问题,打家劫舍问题
题型模板
状态表示
状态转移方程
初始化
填表顺序
返回值
前缀和
两个模板
模板一:将动态规划的模板走一遍(即预处理数组),使用数组
模板二:当前项 + 前一项
详情可以前往链接:蓝桥真题讲解-CSDN博客进行观看
差分
核心模板
数组名[l]++;
数组名[r + 1]--;
思路模板:出现差分的地方必有前缀和
详情可以前往链接:蓝桥真题讲解-CSDN博客进行观看
以上模板优先看
其余模板
滑动窗口
题型特征
能用双指针,就可以考虑是否能用滑动窗口
题型模板
Left = 0, right = 0;
进窗口
判断
出窗口
👆 👇//表示循环
更新结果
二分查找
必记点

当然博主的水平有限,不过对于c组小伙伴们来说基本也就差不多了,如果博主的文章能对其他组的小伙伴有所帮助,博主也是倍感荣幸。
当然赛前这几天这篇文章也还会再更新点内容
最后祝大家旗开得胜!!!
