0


蓝桥杯重点(C/C++)(随时更新)

点关注不迷路,欢迎推荐给更多人

1 技巧

1.1 取消同步(节约时间,甚至能多骗点分,最好每个程序都写上)

  1. ios::sync_with_stdio(false);
  2. cin.tie(0);
  3. cout.tie(0);

1.2 万能库(可能会耽误编译时间,但是省脑子)

  1. #include <bits/stdc++.h>

1.3 蓝桥杯return 0千万别忘了写!!

1.4 编译设置(Dev C++)

(1)工具->编译选项->编译器->编译时加入以下命令->调成C99

(2)工具->编译选项->代码生成/优化->代码生成->语言标准

1.5 memset填充函数

按照字节对内存块进行初始化,注意只能填充0或-1

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[10];
  4. int main()
  5. {
  6. memset(a,-1,sizeof(a));
  7. for(int i=0;i<10;i++)
  8. {
  9. cout<<a[i]<<endl;
  10. }
  11. return 0;
  12. }

1.6 时间复杂度

蓝桥杯每一道题编译时间都限制在1s以内,遇到数据比较大的题目,往往需要降低时间复杂度。

粗略估计,O(n)情况下一秒大概完成4亿次,O(nn)情况下一秒大概完成2万次,O(nn*n)情况下大概完成700次。

由于蓝桥杯评测系统是根据通过样例数来评分,所以我们做题时一定要注意约定样例取值范围。

例题:K倍区间(暴力法只能通过部分样例,所以要用更好的算法)

(1条消息) K倍区间(蓝桥杯2017年第八届省赛B组第十题)(C/C++)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128434135?spm=1001.2014.3001.5501

1.6.1 常数阶 O(1)

  1. int i=1;
  2. int j=2;
  3. int m=i+j;

1.6.2 对数阶 O(logn)

  1. int i=1;
  2. while(i<n)
  3. {
  4. i=i*2;
  5. }

1.6.3 线性阶 O(n)

  1. for(int i=0;i<n;i++)
  2. {
  3. cout<<i<<endl;
  4. )

1.6.4 线性对数阶 O(nlogn)

  1. for(int m=1;m<n;m++)
  2. {
  3. int i=1;
  4. while(i<n)
  5. {
  6. i=i*2;
  7. }
  8. }

1.6.5 多重循环 O(n^k)

k为循环层数

1.7 剪枝

做题时已经发现的不可能取到的数值,就不要再让计算机算了,尽量节省时间,蓝桥杯中目前遇到的还没有用到过过于繁琐的剪枝,大多也是在BFS和DFS中出现(bool vis)

1.8 find函数

函数作用:查找该元素在数组中第一次出现的位置的地址(类似于0x的地址)

模型:find(查找起点,查找终点,查找目标元素)

同样,查找区间为[查找起点,查找终点)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. int a[10]={2,6,8,1,3,7,5,1,0,11};
  6. cout<<find(a+0,a+5,8)<<endl;//打印类似0x地址
  7. cout<<find(a+0,a+5,8)-a<<endl;//打印数组【】内的序号
  8. return 0;
  9. }

1.9 PI问题

PI=atan(1.0)*4

2 基本算法及技巧

2.1 BFS(宽度优先搜索)

用到队列(有时会用到优先队列)

主要思想:把所有符合条件的点都压入队列,然后挨个元素弹出上下左右前后搜索,直到队列清空时代表搜索完毕,搜索的时候注意判断是否已经搜索过,用bool vis【】判断。

例题:全球变暖

(1条消息) 全球变暖(蓝桥杯2018年省赛B组试题I)(C/C++)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128434254?spm=1001.2014.3001.5502

2.2 DFS(深度优先搜索)

用到递归(不好理解)

主要模板:可参见如下全排列例题

http://t.csdn.cn/ANnS1

总结起来有如下几步:

(1)确定 边界 if()return;

(2)进入for循环

(3)判断是否搜索过 if(vis[])vis[]=true; dfs(); vis[]=false;

例题:凑算式

(3条消息) 凑算式(蓝桥杯2016年省赛B组第三题)(C/C++)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128434004?spm=1001.2014.3001.5502

2.3 最大公约数和最小公倍数

最大公约数(greatest common divisor,gcd)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5. cout<<__gcd(25,5);
  6. return 0;
  7. }

最小公倍数 (least common multiple,lcm)

多写一个lcm函数

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int lcm(int a,int b)
  4. {
  5. return a*b/__gcd(a,b);
  6. }
  7. int main()
  8. {
  9. cout<<lcm(25,5);
  10. return 0;
  11. }

2.4 进制转换

2.4.1 十进制为媒介(常用型)

(8条消息) 任意进制转换成十进制/十进制转换成任意进制(ASCII码法)(C/C++)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128297645?spm=1001.2014.3001.5502

2.4.2 二进制为媒介(技巧型)

(2条消息) 十六进制转八进制(蓝桥杯基础练习C/C++)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128745875?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128745875%22%2C%22source%22%3A%22m0_71934846%22%7D

2.5 二进制表示法

例题:无聊的逗

(8条消息) 蓝桥杯试题 算法训练 无聊的逗(C/C++)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128717938?spm=1001.2014.3001.5502

2.6 背包问题

2.6.1 01背包问题

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int v[1000]; // 体积
  4. int w[1000]; // 价值
  5. int f[1000][1000]; // f[i][j], j体积下前i个物品的最大价值
  6. int main()
  7. {
  8. int n, m;
  9. cin >> n >> m;
  10. for(int i = 1; i <= n; i++)
  11. cin >> v[i] >> w[i];
  12. for(int i = 1; i <= n; i++)
  13. for(int j = 1; j <= m; j++)
  14. {
  15. // 当前背包容量装不进第i个物品,则价值等于前i-1个物品
  16. if(j < v[i])
  17. f[i][j] = f[i - 1][j];
  18. // 能装,需进行决策是否选择第i个物品
  19. else
  20. f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]);
  21. }
  22. cout << f[n][m] << endl;
  23. return 0;
  24. }

2.6.2 多重背包问题(每种物品有多件)

把多件物品捏合成一件新的物品,按序号往后叠加即可

2.6.3 完全背包问题(每种物品有无数件)

  1. #include<iostream>
  2. using namespace std;
  3. const int N = 1010;
  4. int f[N];
  5. int v[N],w[N];
  6. int main()
  7. {
  8. int n,m;
  9. cin>>n>>m;
  10. for(int i = 1 ; i <= n ;i ++)
  11. {
  12. cin>>v[i]>>w[i];
  13. }
  14. for(int i = 1 ; i<=n ;i++)
  15. for(int j = v[i] ; j<=m ;j++)
  16. {
  17. f[j] = max(f[j],f[j-v[i]]+w[i]);
  18. }
  19. cout<<f[m]<<endl;
  20. }

2.7 动态规划(DP)

例题:拿金币

(1条消息) 拿金币(蓝桥杯算法训练)(C/C++)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128456365?spm=1001.2014.3001.5502

2.8 贪心

思路:选取局部最优解,但是最大的缺陷就是在某些情况下不适用

举例:纸币问题

比如面额有1元,2元,5元,10元,20元,50元,100元,那么对于110元来说,可以用贪心从最大面额100元开始找。

但是如果改纸币面额,比如1元,2元,5元,20元,55元,100元,那么如果用到贪心算法,会发现并不能找出最优解(贪心:100+5+5=110 动态规划:55+55=110)

2.9 分治(以后更新)

大部分是二分法

2.10 数字分拆到数组中

(2条消息) 把一个数字分拆存到数组内(C/C++)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128698111?spm=1001.2014.3001.5501

2.11 数字和字符串的互化

求不了子数字,但能求子字符串

例题:超级质数

(2条消息) 超级质数(蓝桥杯C/C++算法赛)_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128723978?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22128723978%22%2C%22source%22%3A%22m0_71934846%22%7D

2.12 排序

(4条消息) 找字符串中最大字符(三种快速方法)_求字符串中最大的字符_菜只因C的博客-CSDN博客https://blog.csdn.net/m0_71934846/article/details/128457227?spm=1001.2014.3001.5501

3 STL

3.1 队列(queue)

3.2 链表(list)

3.3 优先队列(priority queue)

优先队列默认大根堆(大到小排序),如果想从小到大排序,那么

<int,vector<int>,greater<int> >//升序排列(小根堆)

<int,vector<int>,less<int> >//降序排列(大根堆)

3.4 向量/动态数组(vector)

3.5 栈(stack)

3.6 集合(set) (要求没有重复元素)

set<int> s;//默认升序排列

set<int, greater<int>> s2 = {3,2,5,1,4 ,3};//降序

set值不能修改(修改过后无法保证数据顺序)

3.7 集合/映射/键值对(map)

3.8 迭代器

模板:

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. int main()
  5. {
  6. vector<int> v;
  7. v.push_back(11);
  8. v.push_back(7);
  9. vector<int>::iterator it = v.begin();
  10. while(it!=v.end())
  11. {
  12. cout << *it <<" ";
  13. it++;
  14. }
  15. cout << endl;
  16. return 0;
  17. }

这里大概列出参加蓝桥杯需要掌握的知识点和技巧,若想详细了解某个知识点,可以看看我的例题和别人的文章

标签: c++ 蓝桥杯 算法

本文转载自: https://blog.csdn.net/m0_71934846/article/details/128721132
版权归原作者 菜只因C 所有, 如有侵权,请联系我们删除。

“蓝桥杯重点(C/C++)(随时更新)”的评论:

还没有评论