蓝桥杯算法训练 区间k大数查询(C++)

本文介绍了一种解决区间内查找第K大数的问题算法,通过局部排序的方法,高效地找出序列中指定区间的第K大数值。适用于数据规模较小的情况,提供了完整的代码实现。

1  问题描述

给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。

输入格式

第一行包含一个数n,表示序列长度。

第二行包含n个正整数,表示给定的序列。

第三个包含一个正整数m,表示询问个数。

接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。

输出格式

总共输出m行,每行一个数,表示询问的答案。

样例输入

5
1 2 3 4 5
2
1 5 2
2 3 2

样例输出

4
2

数据规模与约定

对于30%的数据,n,m<=100;

对于100%的数据,n,m<=1000;

保证k<=(r-l+1),序列中的数<=106。

2  实现思路

首先是接收屏幕的输入数据。

之后对数组的数据进行局部排序,排序范围在l到r之间,并且按从大到小排序。

此时以l为起始的数组,放着当前序列的最大值,并对应后面的第k大,输出即可。

3  代码

#include <iostream>
#include <algorithm> 
using namespace std;
//排序函数从大到小需要用到 
int cmp(int a,int b)
{
	return a>b;
}

void f(int b[],int l,int r,int k,int n)
{
	int a[1001];
	//copy整个数组到新的数组
	for(int i=0;i<n;i++)
	{
		a[i] = b[i];
	}
	//对l到r的数组进行局部排序 	
	sort(a+l-1,a+r,cmp);

	//输出以l为起点的排序,最大的放在l-1,排序则是k-1 
	cout<<a[k+l-2]<<endl;
}


int main(int argc, char *argv[]) {
	
	int n,m;
	int arr[1001],l[1001],r[1001],k[1001];
	
	//获取输入数据 
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>arr[i];
	
	cin>>m;
	for(int i=0;i<m;i++)
	{
		cin>>l[i];
		cin>>r[i];
		cin>>k[i];
	}
	//查找数组从l到r的第k大元素是多少
	for(int i=0;i<m;i++)
	{
		f(arr,l[i],r[i],k[i],n);
	}
	
	return 0;
}

 

 

 

 

<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、付费专栏及课程。

余额充值