C++ 常考算法

常考算法1:求最大、最小值

例如:查找a[]数组中的最小值,n为数组的大小

int func(int a[ ], int n)

{

	int min=a[0];

	for(int i=0;i<n;i++)

	{

	    if(min>a[i]) min=a[i];

	}

	return min; 

}


例如:查找a[ ]数组中的最大值

int func(int a[ ], int n)

{

	int max=a[0];

	for(inti=0;i<n;i++)

	{

	    if(max<a[i]) max=a[i];

	}

	return max; 

}


常考算法2:求阶乘

long func(int n)

{

	int i;

	long t=1;

	for(i=2;i<=n;i++)

	t*=i;

	return t;

}


常考算法3:判断某数为素数

素数是指只能被自己和1整除的数

int prime(int n)

{

	int m;

	for(m=2;m<=sqrt(n);m++)

	if(n%m==0) return 0;

	return 1;

}


常考算法4:冒泡排序

思想:相临的两个数两两比较,如果第一个数大于第二个数,两者交换位置,既将小的排前面,大的排后面

void sort(int a[ ], int n)

{


	int i,j, t;

	for(i=n-1;i>0;i--)

	{

	for(j=0; j<=i; j++)

	if(a[j]>a[j+1])

	{

	t=a[j];

	a[j]=a[j+1];

	a[j+1]=t;

	}

}


常考算法5;求最大公约数

欧几里得算法:

int gcd( int m, int n)

{

	int t,r;

	if(m<n) {t=m; m=n; n=t;}

	while(n!=0)

	{

	r=m%n;

	m=n;

	n=r;

	}

	return m;

}


常考算法6:最小公倍数

算法:两数之积除以最大公约数所得的值即为最小公倍数

int gcd( int m, int n)

{

	int t,r;

	if(m<n) {t=m; m=n; n=t;}

	while(n!=0)

	{

	r=m%n;

	m=n;

	n=r;

	}

	return (m*n)/m;

}


源程序如上,是原版的,当初感觉到了哪里不对劲,可又说不出来,然后实际运行,果然有错,相信有功底的牛人们,一下子就能找到病根所在,红体字显示的原理并没有错,错在返回的表达式上 "(m*n)/m",在while循环结束后此m已然非彼m了。。。

常考算法7:数组元素逆置

voidexchange(int a[ ], int n)

{

	int i,t;

	for(i=0;i<n/2;i++)

	{

	t=a[i];

	a[i]=a[n-i-1];

	a[n-i-1]=t;

	}

}


第一个与最后一个交换,第二个与倒数第二个交换

常考算法8:累加与累乘

例如1+2+3+4+5+6…….100

intadd(int n)

{

	intsum=0;

	for(inti=1;i<=100;i++)

	{

	sum=sum+i;

	}

	returnsum;

}


例如1*2*3*4*+5*6…….100

intadd(int n)

{

	int sum=1;

	for(inti=1;i<=100;i++)

	{

	sum=sum*i;

	}

	returnsum;

}


常考算法9:整数的各位分离

voidinte(int n)

{

	int i;

	while(n)

	{

	i=n%10;

	n=n/10;

	}

}


 

<think>嗯,用户问的是蓝桥杯C++常考算法有哪些。首先,我需要回忆一下蓝桥杯比赛的内容结构。蓝桥杯通常分为省赛和国赛,题目难度递增,涉及的知识点也比较广泛。C++组的话,算法和数据结构肯定是重点。 那用户可能是在准备比赛,想要系统地复习常考算法,提高自己的应试能力。所以需要把常考算法分类整理出来,并且给出一些例子,帮助他们理解每个算法的应用场景。 首先,基础算法部分肯定是必须的。比如排序算法,蓝桥杯里经常会有题目需要用到排序,像快速排序、归并排序这些。还有二分查找,这个在查找类题目中很常见,比如求最大值最小化或者最小值最大化的问题。递归和回溯也是基础中的重点,比如全排列、N皇后问题,这些题目用递归回溯可以解决。 接下来是数据结构部分。数组和字符串处理是基础,但可能会结合其他算法考察。栈和队列的应用,比如括号匹配、滑动窗口问题。链表虽然可能考得少,但也不能忽视。哈希表用于快速查找,比如统计频率或者去重。树结构中,二叉树遍历、二叉搜索树的操作,还有堆的实现和应用,比如优先队列或者Top K问题。 动态规划是难点,也是常考的部分。用户可能需要了解经典问题,比如背包问题、最长公共子序列、编辑距离等。此外,路径问题如最小路径和、打家劫舍问题也是常见的。还有状态压缩DP,处理复杂状态的问题。 图论算法方面,DFS和BFS是基础,用于遍历图或者解决连通性问题。最短路径算法如Dijkstra和Floyd-Warshall可能会在题目中出现,最小生成树的Kruskal和Prim算法也需要了解。拓扑排序处理有向无环图的依赖问题。 数论与数学部分,质数判断、最大公约数、快速幂这些是基本工具。组合数学中的排列组合公式、卡特兰数等可能出现在计数问题里。位运算的巧妙应用,比如异或、位操作技巧,也是需要注意的。 高级算法部分,贪心算法需要掌握区间调度、霍夫曼编码等。前缀和与差分数组处理区间操作,比如区间和、区间增减。双指针技巧,比如快慢指针、滑动窗口,可以优化时间复杂度。并查集处理集合合并与查找,连通性问题适用。 其他需要注意的还有模拟题,这类题目不需要复杂算法,但需要仔细处理细节。还有可能涉及一些STL的使用,比如vector、set、map、priority_queue等,熟练掌握这些容器能提高编码效率。 用户可能需要具体的例子来理解每个算法的应用场景,比如动态规划中的背包问题,或者图论中的最短路径。另外,提醒他们注意代码的时间复杂度,避免超时。在备考时,建议多刷历年真题,熟悉题型和考点,同时加强手写代码的能力,因为比赛需要快速准确地编写代码。 总结下来,应该把各个算法分类,每类下给出常见的考点和例子,结构清晰,便于用户复习。同时强调实践和真题训练的重要性,帮助他们有效准备比赛。</think>蓝桥杯C++常考算法可分为以下几类,结合典型例题和解题思路进行归纳: --- ### 一、基础算法 1. **排序算法** - **考点**:快速排序、归并排序、桶排序 - **例题**:求逆序对数量(归并排序)、第K大数(快速选择) - **代码片段**: ```cpp // 快速排序核心代码 void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l-1, j = r+1, x = q[l + r >> 1]; while (i < j) { do i++; while (q[i] < x); do j--; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j), quick_sort(q, j+1, r); } ``` 2. **二分查找** - **考点**:整数二分、浮点数二分、边界条件 - **例题**:求方程根的近似解、有序数组中目标值首次出现位置 3. **递归与回溯** - **考点**:全排列、子集生成、N皇后问题 - **关键点**:状态恢复与剪枝优化 --- ### 二、数据结构 1. **栈与队列** - **应用场景**:括号匹配(栈)、滑动窗口最大值(单调队列) - **例题**:表达式求值(栈实现) 2. **哈希表** - **考点**:`unordered_map`统计频率、去重 - **例题**:两数之和、最长无重复子串 3. **树与堆** - **二叉树**:前中后序遍历、最近公共祖先(LCA) - **堆**:合并K个有序链表(优先队列) - **代码片段**: ```cpp // 堆的STL使用 priority_queue<int, vector<int>, greater<int>> min_heap; // 小根堆 ``` --- ### 三、动态规划(DP) 1. **经典问题** - **背包问题**:01背包、完全背包(状态转移方程) $$ dp[i][j] = \max(dp[i-1][j], dp[i-1][j-w_i] + v_i) $$ - **路径问题**:矩阵最小路径和、不同路径数 2. **状态压缩DP** - **例题**:旅行商问题(TSP)、棋盘覆盖问题 --- ### 四、图论算法 1. **最短路径** - **Dijkstra算法**:邻接表+优先队列实现 - **Floyd算法**:多源最短路(三重循环) 2. **并查集** - **应用**:连通性问题、最小生成树(Kruskal) - **代码片段**: ```cpp int find(int x) { if (parent[x] != x) parent[x] = find(parent[x]); return parent[x]; } ``` --- ### 五、数学与数论 1. **质数筛法** - **埃氏筛**:标记倍数法 - **欧拉筛**:线性时间复杂度 2. **快速幂** - **公式**:$$ a^b \mod p = (a^{b/2})^2 \mod p \quad \text{(递归实现)} $$ - **例题**:求大数幂模 --- ### 六、其他高频考点 1. **贪心算法** - **例题**:区间调度(选择最多不重叠区间)、分糖果 2. **双指针** - **应用**:有序数组两数之和、链表环检测(快慢指针) 3. **前缀和与差分** - **公式**: $$ \text{前缀和:} S[i] = S[i-1] + a[i] $$ $$ \text{差分:} d[l] += c, d[r+1] -= c $$ --- ### 备考建议 1. **刷题策略** - 重点练习历年真题(官网/题库) - 高频题型:DFS/BFS、动态规划、贪心 2. **代码优化** - 注意时间复杂度(如$O(n^2)$可能无法通过$n=10^5$的数据) - 善用STL(如`sort`、`lower_bound`) 3. **模拟训练** - 限时手写代码(避免依赖IDE调试) 蓝桥杯近年趋向实际应用题(如模拟系统、游戏规则),需灵活结合算法与问题分析能力。建议分模块突破,重点强化弱项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值