Day01
Day1 (2021.1.30)
1.如何准备蓝桥杯
①调试的能力
②刷题量
2.做题套路
算法题:①模型少 ②思维难度较高 ③实践
题目描述 ---> 抽象出考察的模型(平时多刷题)
1)如何判断时间是否会超
对于C++来说,1秒种大概可以运行10^8次 (小于10^7 -10^8 ,一秒钟肯定能运行出来)
2)由数据范围反推算法复杂度以及算法内容

https://www.acwing.com/blog/content/32/
3.递归:自己调用自己
斐波那契数列:1, 2, 3, 5, 8, 13, 21, 55, ……
f(n) = f(n - 1) + f(n - 2) n >= 3
scanf,printf 速度非常快(数据规模>=10^5 );cin,cout速度稍微慢一点(数据规模<10^5 );
理解递归的方式:所有递归都可以画一颗递归搜索树
#include<iostream> //cin,cout
#include<cstring> //memset
#include<csdio> //scanf,printf
int f(int n) {
if(n == 1) {
return 1;
}
if(n == 2) {
return 2;
}
return f(n - 1) + f(n - 2);
}
int main() {
int n;
scanf("%d", &n);
printf("%d", f(n));
return 0;
}
1)Acwing 92题 递归实现指数型枚举
n = 15, 大致2^n 或者n*2^n 时间复杂度
递归很重要的就是顺序,将所有的情况不重不漏的排列。
顺序:从1-n一次考虑每个数选或不选、
#include<iostream> //cin,cout
#include<cstring> //memset
#include<cstdio> //scanf,printf
#include<algorithm>
using namespace std;
const int N = 15;
int n;
int st[N]; //状态,记录每个位置的状态:0表示还没有考虑,1表示选,2表示不选
void dfs(int u) {
if(u > n) {
for(int i = 1; i <= n; i++) {
if(st[i] == 1) {
printf("%d ", i);
}
}
printf("\n");
return;
}
st[u] = 2;
dfs(u + 1);//左边分支,不选
st[u] = 0; //恢复现场
st[u] = 1;
dfs(u + 1);//右边分支,选
st[u] = 0;
}
int main() {
int n;
scanf("%d", &n);
dfs(1);
return 0;
}
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 15;
int n;
int st[N];
vector<vector<int>> ways;
void dfs(int u) {
if(u > n) {
vector<int> way;
for(int i = 1; i <= n; i++)
if(st[i] == 1)
way.push_back(i);
ways.push_back(way);
return;
}
st[u] = 2;
dfs(u + 1);//左边分支,不选
st[u] = 0; //恢复现场
st[u] = 1;
dfs(u + 1);//右边分支,选
st[u] = 0;
}
int main() {
scanf("%d", &n);
dfs(1);
for(int i = 0; i < ways.size(); i++) {
for(int j = 0; j < ways[i].size(); j++)
printf("%d ", ways[i][j]);
puts("");
}
return 0;
}
4.真题
5.注意
- 2^1 - 2^10最好背过, 2^20 大约是10^6 ,2^16 = 65536,2^15 = 32768,2^63 大约为10^18 ;
- https://www.acwing.com/blog/content/32/背一些;

浙公网安备 33010602011771号