蓝桥杯

快速排序

此生再无相见时 提交于 2020-02-25 22:09:19
蓝桥杯历年省赛真题汇总及题目详解 2018年第九届蓝桥杯省赛试题详解 标题:快速排序。 以下代码可以从数组a[]中找出第k小的元素。 它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。 请仔细阅读分析源码,填写划线部分缺失的 # include <stdio.h> int quick_select ( int a [ ] , int l , int r , int k ) { int p = rand ( ) % ( r - l + 1 ) + l ; int x = a [ p ] ; { int t = a [ p ] ; a [ p ] = a [ r ] ; a [ r ] = t ; } int i = l , j = r ; while ( i < j ) { while ( i < j && a [ i ] < x ) i ++ ; if ( i < j ) { a [ j ] = a [ i ] ; j -- ; } while ( i < j && a [ j ] > x ) j -- ; if ( i < j ) { a [ i ] = a [ j ] ; i ++ ; } } a [ i ] = x ; p = i ; if ( i - l + 1 == k ) return a [ i ] ; if ( i - l + 1 < k )

蓝桥杯单片机学习过程记录(十八)第十届电压频率采集N555

半腔热情 提交于 2020-02-24 05:37:10
蓝桥杯单片机学习过程记录(十八)第十届电压频率采集N555 今天完成了第十届的省赛试题,有了新的模块N555,但其实没有用到什么新内容,通过对N555的计数定时来获取其高低频率,试题很明确,将P34 与 SIGNAL短接,什么意思呢,N555是一个频率产生器,频率是产生高低电平反应,那么通过P34反应高低电平的变化,还有一点要注意,为什么要连接P34呢,P34是定时器0进入中断的触发接口,即P34处于上升沿或下降沿时,即可触发定时器0的中断。那么通过对1s内上升沿的计数,即可求得频率,获得结果。 这里是后来参考网上的经验得来,自己做的时候,由于对接口的定义不熟悉,是通过定时1s内,计算1s内高低电平的比例来得到的结果,但是变化不是很规律,所以后来放弃了。 应用内容: 小灯、数码管 独立按键 定时器计数 IIC通信滑动电阻 主函数: //第十届电压频率采集N555 # include <STC15F2K60S2.H> # include <iic.h> # include <intrins.h> sbit s7 = P3 ^ 0 ; sbit s6 = P3 ^ 1 ; sbit s5 = P3 ^ 2 ; sbit s4 = P3 ^ 3 ; sbit led1 = P0 ^ 0 ; sbit led2 = P0 ^ 1 ; sbit led3 = P0 ^ 2 ; sbit

[蓝桥杯][历届试题]翻硬币 Easy only once *贪心问题

杀马特。学长 韩版系。学妹 提交于 2020-02-23 17:10:14
基本思想: 贪心思想掌握的还不是很好,在枚举情况漏了一种: 010 111 此时需要翻两次; 如果使用贪心策略,则是先寻找当下最优解,即:直接遇到不一样的直接翻,之后进行后续的判断; 关键点: 无; #include<iostream> #include<stdlib.h> #include<stdio.h> #include<vector> #include<string> #include<math.h> #include<algorithm> #include<cstring> #include<map> #include<queue> #include<set> #include<stack> using namespace std; int main() { string s1, s2; cin >> s1 >> s2; int cnt = 0; for (int i = 0; i < s1.size(); i++) { if (s1[i] != s2[i]) { //当遇到不相等时; if (s1[i + 1] == '*') s1[i + 1] = 'o'; else s1[i + 1] = '*'; cnt++; } } cout << cnt; return 0; } 来源: https://www.cnblogs.com/songlinxuan/p

第十届蓝桥杯 修改数组

巧了我就是萌 提交于 2020-02-23 04:45:58
第十届蓝桥杯 修改数组 C++ 思路: 若数组中的元素A[i]已存在,将标记数组a[A[i]]标记为1,否则一直加一到a[A[i]]=0。 代码: # include <iostream> # include <cstring> # include <cstdlib> # include <cmath> # define ll long long using namespace std ; //标记数组中的元素,已存在,置为1 int a [ 100005 ] = { 0 } ; int main ( ) { int n ; cin >> n ; int A [ n ] ; for ( int i = 0 ; i < n ; i ++ ) { cin >> A [ i ] ; if ( a [ A [ i ] ] == 0 ) { //如果未被标记 a [ A [ i ] ] = 1 ; //标记,结束 } else { //已被标记 while ( a [ A [ i ] ] != 0 ) //一直加一知道未被标记 A [ i ] + = 1 ; a [ A [ i ] ] = 1 ; //标记得到的新数 } } for ( int i = 0 ; i < n ; i ++ ) //输出 cout << A [ i ] << " " ; cout << endl ; return

1459: [蓝桥杯2019初赛]修改数组(巧用并查集)

ぃ、小莉子 提交于 2020-02-22 20:55:05
题目链接: 点击这里 vis数组标记判重,通过80% 数组元素全部相同时,时间复杂度为 O ( n ( n − 1 ) 2 ) O(\frac{n(n-1)}{2}) O ( 2 n ( n − 1 ) ​ ) ,超时: # include <iostream> # include <cstdio> # include <cstring> # include <algorithm> using namespace std ; int a [ 100010 ] ; bool vis [ 1000010 ] ; int main ( ) { int n ; scanf ( "%d" , & n ) ; for ( int i = 1 ; i <= n ; ++ i ) scanf ( "%d" , & a [ i ] ) ; vis [ a [ 1 ] ] = true ; for ( int i = 2 ; i <= n ; ++ i ) { while ( vis [ a [ i ] ] ) { a [ i ] ++ ; } vis [ a [ i ] ] = true ; } for ( int i = 1 ; i <= n ; ++ i ) printf ( "%d " , a [ i ] ) ; return 0 ; } 搜题解: 这题可以巧妙地利用并查集。 我们初始化 i

蓝桥杯省赛知识点

南笙酒味 提交于 2020-02-22 16:40:56
蓝桥杯省赛知识点 1、C++ STL 常见算法 2、C++ 输入输出(包括流、文件) 3、C++常用泛型:list vector stack map 4、暴力穷举 5、递归 6、全排列 next_permutation 康托展开式 7、回溯 8、DFS、BFS、hash表 9、数学上的有:辗转相除(两行内),素数等 国赛知识点 1、hash表 2、大数(高精度)加减乘除 3、线段树 4、并查集 5、图论相关算法:最短路(Floyd、Dijstra,BellmanFord)、最小生成树(prim,kruscal要用并查集) 6、熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp 7、博弈类算法:博弈树,二进制法等。 8、双向广度搜索、A*算法,最小耗散优先 9、数学:线段交点、多角形面积公式等 ———————————————— 版权声明:本文为CSDN博主「&代码收割机」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/xyqqwer/article/details/81262056 来源: CSDN 作者: 无情·山河 链接: https://blog.csdn.net/qq_44372652/article/details/104443922

[蓝桥杯][算法提高]日期计算

夙愿已清 提交于 2020-02-22 04:52:23
时间限制: 1Sec 内存限制: 128MB 题目描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况。尤其是逢百年不闰,逢400年闰的情况。 输入 输入只有一行 YYYY MM DD 输出 输出只有一行 W 样例输入 2011 11 11 样例输出 5 提示 1599 <= YYYY <= 2999 1 <= MM <= 12 1 <= DD <= 31,且确保测试样例中YYYY年MM月DD日是一个合理日期 1 <= W <= 7,分别代表周一到周日 分析:直接用蔡基姆拉尔森公式 C语言代码: # include <stdio.h> int whatday ( int year , int month , int day ) { int ans ; if ( month == 1 || month == 2 ) { month = 12 + month ; year -- ; } ans = ( day + 2 * month + 3 * ( month + 1 ) / 5 + year + year / 4 - year / 100 + year / 400 ) % 7 + 1 ; return ans ; } int main ( ) { int year , month , day ; scanf ( "%d %d %d" , &

蓝桥杯—PCF8591、IIC总线、EEPROM介绍

僤鯓⒐⒋嵵緔 提交于 2020-02-21 22:25:11
1、IIC总线相关介绍 I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。下面根据官方提供的库文件,介绍需要注意的函数有: (1)void init_pcf8591(void) void init_pcf8591(void) { i2c_start(); i2c_sendbyte(0x90); i2c_waitack(); i2c_sendbyte(0x03); //ADC通道3 i2c_waitack(); i2c_stop(); operate_delay(10); } 这个函数为PCF8591初始化函数,对于选择通道函数为i2c_sendbyte(),上述代码选择通道3。 最后两位配置选择哪个通道 ,其余位不用管。 (2)unsigned char adc_pcf8591(void) unsigned char adc_pcf8591(void) { unsigned char temp; i2c_start(); i2c_sendbyte(0x91); i2c_waitack(); temp = i2c_receivebyte(); i2c_sendack(1); i2c_stop(); return temp; }

【蓝桥杯ALGO-59】快速排序 Java版

柔情痞子 提交于 2020-02-21 11:22:37
试题 算法训练 快速排序 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述   快速排序是最经常使用的一种排序方式,对于给定的n个数组成的一个数组,请使用快速排序对其进行排序。   现给定一序列,请用快速排序将其按升序排序并输出。 输入格式   第一行一个数N。   第2~N+1行每行一个数,表示给定序列。 输出格式   共N行,每行一个数,表示所求序列。 样例输入 5 1 4 2 3 4 样例输出 1 2 3 4 4 数据规模和约定   共10组数据。   对100%的数据,N<=10^5,所有数均为非负数且在int范围内。 分析 对于已经排好序,或者接近排好序的情况,会进入最差情况,时间复杂度衰退到 O(n^2),采用三数中值分割法选取分区点(pivot),避免出现时间复杂度退化到最糟糕情况。 参考: 工具类算法–快排的优化(Java) Java 代码: import java . io . * ; public class Main { private static int [ ] a ; public static void main ( String [ ] args ) throws Exception { BufferedReader in = new BufferedReader ( new InputStreamReader ( System .

蓝桥杯2016年省赛C/C++大学A组

爱⌒轻易说出口 提交于 2020-02-20 13:36:10
网友年龄 某君新认识一网友。 当问及年龄时,他的网友说: “我的年龄是个2位数,我比儿子大27岁, 如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄” 请你计算:网友的年龄一共有多少种可能情况? 提示:30岁就是其中一种可能哦. 请填写表示可能情况的种数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 思路: 挺好分析的,因为网友比儿子大27岁,所以直接从27开始遍历(<100岁)在利用年龄关系式 \[(Dad年龄)ab -27 == ba ? count++: count+=0 \] #include<bits/stdc++.h> using namespace std; int main() { int count = 0; for (int Dad = 27; Dad < 100; ++Dad) { int Son = Dad - 27; int t = Dad % 10 * 10 + Dad / 10; if (t == Son)count++; } cout << count << endl; return 0; } 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。 现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。 注意