2022年4月9日又是新一届蓝桥杯大赛,再次,根据往年蓝桥杯考题我整理了算法模板,一来用于复习巩固,二来有需要的小伙伴们可自取,同时预知小伙伴们取得好成绩。
1:判断闰年
bool isLeaf(int x){
return (x % 400 == 0) || (x % 4 == 0 && x % 100 != 0) ;
}
2:计算从xx年xx月xx日 ------ xx年xx月xx日 一共经历了多少天
int end_year , end_month , end_day ;
int count_day(int year , int month , int day){
int ans = 0 ;
int mon[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
while(1){
if(end_year==year && end_month == month && end_day == day){
break ;
}
day++;
if(isLeaf(year) && month==2){
if(day>mon[month]+1){
month++;
day=1;
}
}else{
if(day>mon[month]){
month++;
day=1;
}
}
if(month>12){
month=1;
year++;
}
ans++;
}
return ans;
}
3:欧拉筛选素数
const int N = 999999 ;
int vis[N] , prim[N] ;
int cnt = 0; // 素数的个数
for(int i = 2 ; i < N ; i ++){
if(vis[i] == 0) prim[cnt++] = i ;
for(int j = 0 ; j < cnt && prim[j] * i < N ; j ++ ) {
vis[i * prim[j]] = 1 ;
if(i % prim[j] == 0 )
vis[i] = 1 ;
break ;
}
}
4:计算gcd。
// 使用 __gcd(int a, int b) 函数
int a = 3 , b = 9 ;
cout << __gcd(a , b) ; // 输出的就是a与b的gcd函数
5:01背包
for(int i = 1 ; i <= n ; i ++ ){
for(int j = V ; j >= a[i] ; j --){
dp[j] = max(dp[j] , dp[j - a[i]] + w[i]) ; // 背包容量还剩下j的容纳的最大价值
}
}
6:快速幂运算
const int mod = 1e9 + 7 ; // (a的b次方对mod取模)
int ksm(int a, int b){
int res = 1 ;
while(b){
if(b&1) res = res % mod * a % mod ;
a = a % mod * a % mod ;
b >>= 1 ;
}
return res ;
}
7:全排列实现
(1): 递归
const int N = 1e5 + 7 ; // (a的b次方对mod取模)
int a[N] , n , vis[N];
void s(int pos){
if(pos == n + 1){
for(int i = 1 ; i <= n ; i ++){
cout << a[i] << " " ;
}
cout << endl ;
return ;
}
for(int i = 1 ; i <= n ; i ++){
if(vis[i] == 0){
a[pos] = i ;
vis[i] = 1 ;
s(pos + 1) ;
vis[i] = 0 ;
}
}
}
s(1) ;
(2) : 函数 next_permutation
cin >> n ;
for(int i = 1 ; i <= n ; i ++){
a[i] = n - i + 1 ;
}
sort(a + 1 , a + 1 + n ) ;
do{
for(int i = 1 ; i <= n ; i ++){
cout << a[i] << " " ;
}
cout << endl ;
}while(next_permutation(a + 1 , a + 1 + n)) ;
8:计算组合数
const int N = 20 ; // (a的b次方对mod取模)
int a[N][N] ;
void j(){
a[0][0] = 1 ;
for(int i = 1 ; i < N ; i ++){
a[i][0] = 1 ;
for(int j = 1 ; j < N ; j ++){
a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
}
}
}
9:并查集
void init(){
for(int i = 0 ; i < N ; i ++){
p[i] = i ;
}
}
int find(int x){
if(x != p[x]) p[x] = find(p[x]) ;
else return x ;
}
一:蓝桥杯偏向于思维,算法较少。(根据往年经验,dp + 搜索 + 数论 + 枚举 就是所有知识点 )
二:时间复杂度过高,也是可以把代码写上去,得到一部分分数。
三:对于特殊值一定要优先考虑,可获得一部分分数。
四:没有思路的题,直接暴力枚举,可以获得一部分分数。