
蓝桥杯
凌汐凡
这个作者很懒,什么都没留下…
展开
-
蓝桥杯赛前复习
pair用法:应用场景:主要是将两个数据合成一组数据,基础实现是结构体,可以直接使用成员变量头文件:#include <utility>构造:pair<T1, T2> p1;//T1,T2为数据类型,p1为变量名访问成员变量:p1.first;p1.second;简化:typedef pair<string,string> AuthorAuthor proust(“March”,“Proust”);全排列DFS实现//index:当前一共搜索index原创 2021-04-17 22:09:38 · 420 阅读 · 1 评论 -
高精度大数据 阶乘计算
高精度大数据 阶乘计算问题描述 输入一个正整数n,输出n!的值。 其中n!=123*…*n。算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。输入格式 输入包含一个正整数n,n<=1000。输出格式 输出n!的准原创 2021-03-18 19:50:16 · 364 阅读 · 0 评论 -
C++ map用法总结(按个人需求整理)
C++ map用法总结(按个人需求整理)头文件#include <map>定义map定义方法为map<key,values> a;其中key与values一一对应,可以通过key来查找其对应的values,key和values可以是任意类型的,按自己的需求定义,例如:map<string,int> s;当然这样的定义很长,我们可以重命名一下,然后定义就简单了:typedef map<string,map> maps;maps s;转载 2021-03-17 20:52:11 · 515 阅读 · 0 评论 -
试题 算法训练 方格取数
试题 算法训练 方格取数问题描述 设有NN的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。 某人从图的左上角的A 点(1,1)出发,可以向下行走,也可以向右走,直到到达右下角的B点(N,N)。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。 此人从A点到B 点共走两次,试找出2条这样的路径,使得取得的数之和为最大。输入格式 输入的第一行为一个整数N(表示NN的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上原创 2021-03-17 19:46:10 · 630 阅读 · 1 评论 -
算法训练 回文数
算法训练 回文数问题描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。又如:对于10进制数87: STEP1:87+78 = 165 STEP2:165+561 = 726 STEP3:726+627 = 1353 STEP4:1353+3531 = 4884在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。写一个程序,给定一个N(2&原创 2021-03-15 20:48:16 · 311 阅读 · 0 评论 -
算法训练 拦截导弹
算法训练 拦截导弹问题描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。输入格式 一行,为导弹依次飞来的高度输出格式原创 2021-03-15 11:43:08 · 265 阅读 · 0 评论 -
二叉树遍历以及求层数
二叉树遍历以及求层数#include <iostream>#include <algorithm>using namespace std;typedef struct Node{ int data; Node* lchild,* rchild;}Node;Node* createNode(int data)//创建根节点,同时令左右节点为null{ Node* temp = (Node*)malloc(sizeof(Node)); temp->data原创 2021-03-14 15:37:31 · 790 阅读 · 0 评论 -
动态规划—最优子结构
动态规划—最优子结构问题:算法训练 乘积最大 问题描述今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:有一个数字串:原创 2021-03-14 15:02:59 · 1131 阅读 · 0 评论 -
看了必懂的并查集原理(转载)
看了必懂的并查集原理(转载)并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?)首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块。像畅通工程这题,问还需要修几条路,实质就是求转载 2021-03-13 19:37:57 · 122 阅读 · 0 评论 -
DFS解经典迷宫
DFS解经典迷宫题目:S是起点,G是终点,.是路径,#是墙输入mn表示墙的行列输入样例:5 5#S###…##.#.###…###…G##123456输出结果:5前面已经更新了如何用BFS求解经典迷宫,但是凡事能用BFS的题目,基本都能用DFS来解,下面放DFS求解经典迷宫的代码:#include <iostream>#include <queue>#include <algorithm>#include <cstring原创 2021-03-13 18:16:26 · 148 阅读 · 0 评论 -
BFS解经典迷宫问题
BFS解经典迷宫问题对于经典的迷宫问题,路径是没有权值不同之分的,对于这种问题,采用BFS更合适下面放题目:S是起点,G是终点,.是路径,#是墙输入mn表示墙的行列输入样例:5 5#S###..##.#.###..###..G##输出结果:5关于BFS,最近看了一个写的很好的博主,放上链接:图论(四)宽度优先搜索BFS按照这个思路,我的代码如下:#include <iostream>#include <queue>#include <algo原创 2021-03-12 21:08:30 · 214 阅读 · 0 评论 -
递归实现二叉树遍历
递归实现二叉树遍历#include <iostream>#include <algorithm>using namespace std;typedef struct Node{ int data; Node* lchild,* rchild;}Node;Node* createNode(int data)//创建根节点,同时令左右节点为null{ Node* temp = (Node*)malloc(sizeof(Node)); temp->data原创 2021-03-10 21:14:07 · 136 阅读 · 0 评论 -
数列排序(冒泡法)
冒泡法是一种简单易理解的数列排序,方法是从左到右依次进行两个元素的比较,每轮比较完之后,最大or最小的数就会出现在数组最右端,下一轮就可以不用比较最后一个数了,也就是说每轮比较次数都会递减。此外,当有n个数进行排序时,第一轮最多需要n-1次比较,例如当我们有十个数需要排序,第一轮比较九次就可以了。附上冒泡排序的代码:void sort(int *p,int n)//冒泡法排序 { int ...原创 2020-01-16 22:09:23 · 1346 阅读 · 0 评论 -
分治算法——归并排序
分治算法——归并排序/*归并排序使用分治算法先将待排序数组一分为二,再分为四,再分为八...直到不可再分,然后逐渐的有序排序,每两个子序列之间合并排序特点:稳定,能够最大限度的按照输入的顺序排列 */ #include <iostream>using namespace std;void mergeArray(int s[],int begin,int end,int mid){ //临时创建一个数组,用于合并两个子序列 int* temp = new int[end-原创 2021-03-10 20:55:14 · 276 阅读 · 0 评论 -
冒泡排序+二分查找
冒泡排序+二分查找#include <iostream>#include <algorithm>using namespace std;int a[9] = {3,1,5,8,9,4,5,3,0};void output(int *a){ for(int* i = a;i<a+9;i++) { cout<<*i<<" "; } cout<<endl;}int findnum(int num){ int l原创 2021-03-10 19:57:17 · 230 阅读 · 0 评论 -
最长上升子序列(贪心+二分)
最长上升子序列(贪心+二分)最长上升子序列的求法,除了最朴素的动态规划外,还有利用贪心和二分法进行求解,其时间复杂度为O(nlogn),低于动态规划的时间复杂度O(n2),在蓝桥杯这种测试样例巨大的竞赛中,使用贪心+二分法可以有效避免超时原理对于一个数列a = {1,3,2,5,9,4,10},我们定义一个数组s和数组b,数组b用来存储可能的上升序列。s[i]表示长度为i的最长上升子序列的结尾元素,当然这个值越小越好,因为对于一个上升序列,结尾的值越小,越容易往后面添加值,这就是求解的一个贪心思想。原创 2021-03-09 18:16:06 · 710 阅读 · 0 评论 -
fill()函数参数:fill(first,last,val);
fill()函数参数:fill(first,last,val);// first 为容器的首迭代器,last为容器的末迭代器,val为将要替换的值。举例:int a[200];fill(a, a+100, 1);12注意:fill()中 ,它的原理是把那一块单元赋成指定的值,也就是说任何值都可以memset(),则是将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,即0 、1...转载 2021-03-09 17:52:40 · 397 阅读 · 0 评论 -
最长上升子序列(lIS)
最长上升子序列(lIS)最长上升子序列一般有三种求解方法,分别是时间复杂度为O(n2)的动态规划求法,时间复杂度为O(nlogn)的贪心+二分法,以及时间复杂度为n(nlogn)的树状数组优化的动态规划(DP)动态规划根据动态规划的一般规则,我们若想知道长度为n的数列a[n]的最长上升子序列,可以根据前(n-1)个数列的最长上升子序列,再跟第n个数作比较,得到前n个数的最长上升子序列…以此列推,直至求得第一个数的最长上升子序列,当然LIS(1) = 1;下面开始动态规划五部曲:确定dp数组及其含义原创 2021-03-08 22:47:06 · 271 阅读 · 0 评论 -
算法提高 秘密行动
算法提高 秘密行动问题描述 小D接到一项任务,要求他爬到一座n层大厦的顶端与神秘人物会面。这座大厦有一个神奇的特点,每层的高度都不一样,同时,小D也拥有一项特殊能力,可以一次向上跳跃一层或两层,但是这项能力无法连续使用。已知向上1高度消耗的时间为1,跳跃不消耗时间。由于事态紧急,小D想知道他最少需要多少时间到达顶层。输入格式 第一行包含一个整数n,代表楼的高度。接下来n行每行一个整数ai,代表i层的楼层高度(ai <= 100)。输出格式 输出1行,包含一个整数,表示所需的最短时间原创 2021-03-03 16:39:50 · 251 阅读 · 1 评论 -
动态规划——一维dp数组与二维dp数组
动态规划——一维dp数组与二维dp数组对于二维dp数组,递推公式为:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);其实可以发现如果把dp[i - 1]那一层拷贝到dp[i]上,表达式完全可以是:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);于其把dp[i - 1]这一层拷贝到dp[i]上,不如只用一个一维数组了,只用dp[j](一维数组,也可以理解原创 2021-03-01 10:00:40 · 14696 阅读 · 3 评论 -
动态规划学习记录
动态规划学习记录二维dp数组01背包使用二维dp数组dp[i][j],dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。那么可以有两个方向推出来dp[i][j]:放物品i,或者不放物品i1.由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]2.由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[原创 2021-02-28 13:09:13 · 83 阅读 · 0 评论