蓝桥杯 常用(常考)算法 模板大全 富含比赛技巧 得分方法

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 + 搜索 + 数论 + 枚举 就是所有知识点 )

二:时间复杂度过高,也是可以把代码写上去,得到一部分分数。

三:对于特殊值一定要优先考虑,可获得一部分分数。

四:没有思路的题,直接暴力枚举,可以获得一部分分数。

你可能感兴趣的:(基础算法,c++,算法,动态规划)