蓝桥杯刷题总结 + 应赛本事
当各位小同伴们看到这篇文章的时间想必蓝桥杯也快开赛了,那么本篇文章博主就来总结一下一些蓝桥杯的应赛本事,那么仍旧先来走个流程https://i-blog.csdnimg.cn/direct/de57704ee0dc42b693b832a53797bb5b.gif
那么接下来我们分成几个板块举行总结
起首是一些根本语法
编程语言的根本语法
起首是数组,在存数据的时间,发起先从1开始存,为啥这么干呢,博主在刷题的过程中有反复由于下标从0开始存,导致末了在明白上出现了一些不须要的贫苦。这里我有须要说一下蓝桥杯第十五届回文数组这题,当时就是由于数据从0开始存导致在明白上绕了好大的弯才想明白。
其次是指针,对于大一的小同伴们大概照旧用当初谁人模板——范例 *指针名,不消想这么复杂,直接用数组的下标代替即可,我们须要将指针作为一个头脑而非死用模板。
末了是设置范例上,发起各位小同伴直接使用long long 范例,如许可以制止出现一些数据由于范例范围小而溢出,从而出现一些贫苦
那么接下来就到了编程的本事板块
填空题本事
本事一:巧用excel
参考例子:蓝桥真题解说-CSDN博客
本事二:巧用python
着实博主不太保举本事二,由于赛场上不愿定有pycharm,看情况而定吧
编程本事
取出一个整数中的某个位的数(个位,十位,百位,千位)
While(条件)
{
tmp %= 10;
Tmp /= 10;
} 这个不发起各人直接当成模板背,发起去明白,而且明白起来也很轻松,固然对于大一只想拿个省奖的同砚照旧可以思量记一下的
将某些数存放进哈希表
for(int i = 0; i < n; i++)
{
tmp = 数组名
hash = tmp;
}
颠末博主多次思量决定将之前的模板改成了这个,究竟是资助各人,而不是给各人制造贫苦,固然也发起各人先去试试,有标题就在品评区留言,注意哈!这是c++才华用的哦,c语言用了,而且出标题,博主可不背锅哈!
哈希表统计数
举两个例子
非字母的统计
https://i-blog.csdnimg.cn/direct/ea0b438670fb45d58009469f19ab1ee1.png
字母的统计
hash[数组名 - a]
已经把握哈希的小同伴,请忽略这两点
界说变量时的范例
界说变量时用的范例发起直接用long long 范例(即长整型),而且代码中全部变量的范例都保持划一,如许可以制止因超出范围而出现的bug的贫苦
二维数组的坑
二维数组不能开太大,而且vector<vector<int>>范例的也是一样不能开太大,怎么判断本身是否开太大了呢?博主是这么以为的,凌驾10000的就已经很大了,固然有差异见解的小同伴欢迎品评区留言,我们可以相互交换一下
数组的创建与传参
一维数组的界说:范例 数组名[ 元素个数 ] eg.int arr;(用这个也ok),最好放在main函数和其他函数的表面(也就是作为全局变量)
二维数组的界说:范例 数组名[ 行 ][ 列 ]
传参:
一维数组:
形参部门:范例 函数名(范例 数组名[数组巨细])
实参部门: 函数名(数组名,其他参数)
二维数组:
形参部门:范例 函数名(范例数组名[行][列])此中行可以省略,列不可以省略
实参部门: 函数名(数组名,其他参数)
涉及排序
那么为了制止出现一些不须要的bug,我们可以直接使用sort容器对元素举行排序,那么以下是sort容器的使用模板
sort(数组名【出发点位置】, 数组名 + 长度【止境位置】);
sort(数组名【出发点位置】, 数组名 + 长度【止境位置】, 函数名);
第二个模板是须要我们本身再写一个函数,而且只要写怎样排序即可
举个例子
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
struct node
{
int x, y, z;
int xw, yw, zw;
}a;
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.x;
for(int i = 1; i <= n; i++) cin >> a.y;
for(int i = 1; i <= n; i++) cin >> a.z;
for(int i = 1; i <= n; i++)
{
a.xw = a.x - a.y - a.z;
a.yw = a.y - a.x - a.z;
a.zw = a.z - a.y - a.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.xw;
while(i <= n && xv > 0)
{
i++;
xv += a.xw;
x_ans++;
}
sort(a + 1, a + 1 + n, cmp2);
i = 1;
yv += a.yw;
while(i <= n && yv > 0)
{
i++;
yv += a.yw;
y_ans++;
}
sort(a + 1, a + 1 + n, cmp3);
i = 1;
zv += a.zw;
while(i <= n && zv > 0)
{
i++;
zv += a.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> 对象名
使用案例(仅供参考)
#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 == s && s != s)
{
q.insert(i);
q.insert(i + 1);
}
if(s == s && s != s)
{
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;
}
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
由于少写了什么代码导致末了的结果与预期差异
https://i-blog.csdnimg.cn/direct/23c75ec7c57a4848af97ce58baee02b2.png
就比如这题,预期答案是58,但是现实输出是2,那么怎样找到这个标题呢
https://i-blog.csdnimg.cn/direct/81add28c3b5c4efc8a07c10993642a82.png
在sum += judge(……)这行代码的背面,编写输出语句,再次实行步伐,我们可以发现它照旧只输出了2
https://i-blog.csdnimg.cn/direct/2043e75fd65b4fdfaaa83a3db6fef962.png
那么照旧给大一的小同伴说一个知识点:假如是正常的for 按理说是不会只输出一个sum的值(在无特殊情况下),为了让这个bug出现得更显着一点,我们还可以在small那段代码背面加输出语句,如下图
https://i-blog.csdnimg.cn/direct/979fd8759d22403e8b1ed2feadb6ea40.png
那么就可以确定这里是有bug的,那么接下往返到我们一开始的代码原理图上
https://i-blog.csdnimg.cn/direct/b977bd61140a46309b4e69daacea7eff.png
团结原理图和本身所编写的代码我们可以发现,两层for循环只走了了一次(这里是靠走读代码的本事,怎么走读下面会讲)缘故原由是少了'=',那么标题来了,为啥会出现二呢?由于下面另有个judge函数,而且我们传已往的参数有数组名和a,b两个变量,进入到judge函数后又会根据我们所写的实行,以是才会出现2
案例2
在当地能通过,在云端通不外
https://i-blog.csdnimg.cn/direct/4d1a930cd870462ea626229e068cd459.png
那么出现这种情况,我们可以优先思量是否出现数组越界的标题,如上图就很显着,条件限定的是i,但对i + 1却没有限定导致出现一个越界,别的i从0开始,导致i - 1越界,因此使适当地能通过,而云端通不外。
案例3
https://i-blog.csdnimg.cn/direct/94d938110eea4d9b95ee392f3ad491a0.png
如图所示,这个bug在devc++中表现定名辩说,办理方法:更改一下a和b这两个变量的名字即可
题型模板
动态规划
题型特性
背包标题,路径标题,打家劫舍标题
题型模板
状态表现
状态转移方程
初始化
填表序次
返回值
前缀和
两个模板
模板一:将动态规划的模板走一遍(即预处理惩罚数组),使用数组
模板二:当前项 + 前一项
详情可从前往链接:蓝桥真题解说-CSDN博客举行观看
差分
焦点模板
数组名++;
数组名--;
思绪模板:出现差分的地方必有前缀和
详情可从前往链接:蓝桥真题解说-CSDN博客举行观看
以上模板优先看
别的模板
滑动窗口
题型特性
能用双指针,就可以思量是否能用滑动窗口
题型模板
Left = 0, right = 0;
进窗口
判断
出窗口
👆 👇//表现循环
更新结果
二分查找
必记点
https://i-blog.csdnimg.cn/direct/54561bf183f342d6983f903df6fd18df.png
固然博主的水平有限,不外对于c组小同伴们来说根本也就差不多了,假如博主的文章能对其他组的小同伴有所资助,博主也是倍感荣幸。
固然赛前这几天这篇文章也还会再更新点内容
末了祝各人马到乐成!!!
https://i-blog.csdnimg.cn/direct/2344ce98c6764bcb8176c955666c5ef1.jpeg
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]