自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 基础实验7-2.2 插入排序还是堆排序

题目链接思路:我们知道,插入排序是将数插入左方合适位置,使数组的左方逐渐有序的,而一次排序后数组无序段后面那段与排序前相同.而堆排序是将堆顶元素堆积到右边,数组的右方逐渐有序,而排序前后左方前面某段是不同的.因为堆排序是将堆顶元素与堆末元素交换,而使得被交换后的堆顶元素与堆末元素后方数组有序,同时抛弃堆末元素,即堆的Size–,所以从数组左方检测有序性以判断是哪种有序,从左边开始,若左方某段有序,且后方与排序前数组相同,则第一个无序的地方就是插入排序下一个需要排的地方.#include#include

2021-02-25 23:59:14 915

原创 进阶实验5-3.3 基于词频的文件相似度

题目链接思路:既然要统计词频,那我们可以选择将单词存到哈希表里,然后在文件里存单词的地址,在需要对比时直接通过指针访问该单词,此外,我将每个文件按其指针所指向的单词的字典序将指针排好序,这样在两文件进行比对时可以按顺序依次比较过去,节省了一定的时间,其他还有要处理的细节如注释所示.2021/02/25 19:32:54 答案正确30 编程题 C++ (g++) 208 ms 测试点 提示 结果 分数 耗时 内存0 sample 答案正确18 19 ms 12080 KB1 同一文件内重复出

2021-02-25 19:35:30 483

原创 进阶实验6-3.6 最小生成树的唯一性

题目链接思路:这题要求取最小生成树的唯一性.那么最小生成树在什么情况下不唯一呢,当我们用kruskal算法构建最小生成树时,即把所有边按照权值从小到大一次排列,每次从中取不会令当前已建好的树形成回路的边,当我们发现有多条最优权值的边有相同的连接效果,即边两边连接的集合相同,即可知道最小生成树不唯一.比如现在已建好的树有两集合,1-3-5和2-4-6,此时有多条边有相同的最优权值且可连接两集合形成1-2-3-4-5-6的连通集,则最小生成树不唯一.注意:我使用的并查集中存负数的节点为根节点,其值为该集合的

2021-02-24 20:30:38 262

原创 进阶实验8-2.3 二叉搜索树的最近公共祖先

题目链接思路:寻找公共祖先是题目主要任务,我选择了将两节点的祖先及自身分别都抛入两个堆栈中,两堆栈中抛出的最后一个两者都有的元素即为两节点公共祖先.#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<stack>using namespace std;const int MAX = 10000;int way;//决定插入哪个

2021-02-24 13:05:15 261

原创 进阶实验8-2.1 逆散列问题

题目链接思路:既然是逆散列,在多种可能的插入情况下择最小数而插,则我们需要先将所有正数存入s数组,将其从小到达排列,从最小的数开始检查其是否满足插入条件,即可.#include<iostream>#include<cstdio>#include<algorithm>#include<vector>using namespace std;const int MAX = 1e3;bool vis[MAX];//插入点是否用过int num[MAX

2021-02-24 00:31:55 419

原创 基础实验8-1.2 直捣黄龙

题目链接思路:1.使用哈希表将字符串转化为图的头结点的下标,并且在图的头结点中另外存储作为此点到起点的最短距离min_dis、最大杀敌数max_enemies、最长路径长max_len以及从起点出发到达此点的最多路径cnt的下标.2.使用dijkstra算法求取最短路.#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#

2021-02-24 00:02:52 297

原创 进阶实验6-3.3 天梯地图

题目链接答案正确测试点 提示 结果 分数 耗时 内存0 sample 1等价,最短并列取最快>T;最快并列取最少,正好也是最短>D 答案正确9 5 ms 2748 KB1 sample 2等价,只输出1条路线 答案正确9 5 ms 2744 KB2 最短并列取最快=T,但节点多;最快并列取最少,但非最短;路径有部分重合 答案正确7 5 ms 2744 KB3 最小规模,输出一条直达 答案正确2 4 ms 2760 KB4 最大规模,随机完全图 答案正确3 46

2021-02-21 18:41:50 196

原创 基础实验7-2.1 魔法优惠券

思路:利用sort,将两数组排序,四个指针分别指向两数组头和尾,当指向同一端的两指针指示值符号相同,加之。#include#include#include#includetypedef long long ll;using namespace std;int a[1000000], b[1000000];int main() {ll sum=0;int N, M;scanf("%d", &N);for (int i = 0; i < N; i++)scanf("%d"

2021-02-16 00:07:00 227

原创 进阶实验4-3.5 哈夫曼编码

题目链接简要思路:1.首先,我们需要自己建一棵哈夫曼树,这里我们用到了自己写的最小堆,也可以用STL里的优先队列,从最小堆中每次取出两个权值最小的元素,将它们合并,并插入原堆中,重复该操作直到堆中只剩一个元素,说明建树完成。2.用read函数遍历求取最小字节,遍历哈夫曼树,读到两边都为nullptr的即是作为叶子节点的字符结点。3.计算样例中字节总长度和其单字符最长的字节长度,总长度必须等于最小字节,最长字节长度小于编码字符数N,才进入下一步判断。4.进一步的判断是样例中的哈夫曼树能否建成,若存在

2021-02-15 22:46:17 456

原创 基础实验4-2.5 关于堆的判断

首先,在堆数组中,从1开始存数,设节点坐标n,则其左右子节点坐标分别为2n和2n+1,其父节点坐标为n/2.判断条件如下:1.是根节点,则堆数组首位为该数2.两节点互为兄弟节点,则两节点父母节点相同,我的堆数组由1开始存数,一个结点的父母节点坐标即该节点坐标/2,设两节点坐标分别为x1,x2,则判断条件为(x1/2)==(x2/2)3.互为父子结点,设父节点f1,子节点s1,判断条件即为(s1/2)f1.#include#include#include#include#includest

2021-02-14 00:10:54 365

原创 最小生成树 案例6-1.7 公路村村通

题目链接思路:最小生成树问题,我们直接利用kruskal算法。即将所有边按照权重从小到大排列,每次挑选其中权重最小的边生成树,并且每次挑选时要筛去选择该边会形成回路的边,利用并查集即可,若在并查集中两点同根,即两点连通,则选择连接两点的边会形成回路.#include#include#include#includeusing namespace std;const int MAX = 3e3;struct edge {int v, t, w;edge(int a, int b, int c

2021-02-13 23:20:56 344

原创 进阶实验6-3.1 红色警报

题目链接思路:利用并查集,每次删完结点,统计连通块,如果比原来多了1块及以上,则说明出现连通块分裂,该节点对其他节点有影响,因为我在题目中统计连通块的方式是遍历对于所有结点的root数组,是-1则连通块加一,但删除该点后还是会统计到这个点为连通块,故题目中的判断是删后连通块>原连通块+1。#include#include#include#includeusing namespace std;const int MAX = 5e2+5;int root[MAX];bool _map[MA

2021-02-13 00:13:06 119

原创 基础实验4-2.4 搜索树判断

对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。输入格式:输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。输出格式:输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或

2021-02-12 23:57:08 251

原创 7-4 是否同一棵二叉搜索树

思路:建两棵二叉树相互比较即可.题目链接#include<algorithm>#include<cstdlib>#include<iostream>using namespace std;typedef struct Tree { int Data; struct Tree* Left,*Right;}tree;int read();tree* create(int S);tree* insert(tree* T,int temp);bool c

2021-02-10 23:10:45 127

原创 案例7-1.2 插入排序还是归并排序

思路:1.要区分插入排序和归并排序,我们需要知道的是经过插入排序的前后两个数组的是有一段相同后缀的(除非你插入的是右边最后一个元素且改变了原位置,此时左边都有序了,这种情况造成的前后改变归并排序也可以做到),且前面是已经排好了序的.故我们从前面开始检查排序后的数组它的最长有序长度,并将第一个无序的坐标记录下来作为下一个可能的插入元素以便后续的下一步插入操作,再判断此后的后缀是否与原数组相同,相同则是经历了插入排序.2.区分过后,下一个点就是进行下一步排序了,那么插入排序好办,我们利用前面记录的有序的分界

2021-02-10 22:29:00 1319

原创 案例7-1.1 模拟EXCEL排序

题目链接思路:要简洁地完成该题,我们需要:1.建立一个结构体,包含了学生的三种信息2,.进行排序。这里我用了归并排序。原理如下图,先递归将数组不断均分至最小,再对两个最小单位之间进行比较并依次加入临时的数组中,并将其复制到原数组相应位置上,这样得到最小单位的有序数组,并由底向上不断进行排序逐步得到最大的有序数组.3.使用compare函数来作为归并排序时插入排序的条件,传入结构体和比较方法即可进行有条件的比较.https://www.cnblogs.com/chengxiao/p/6194356

2021-02-09 21:29:49 515

原创 PTA 案例6-1.4 地下迷宫探索

题目链接题目用简单的DFS就能解决,解决步骤如下:1.先用insert建好邻接表,在G图中,元素G[i]代表由与边i邻接的点组成的单链表,且我们在insert操作中有目的地使邻接点从链表头至链表尾由小到大依次连接,以达成题目中“约定以节点小编号优先的次序访问”的目的.2.我们使用STL中的bitset容器,先将test设置为全部访问过的状态(即所有代表点i的test[i]都置为1),dfs后再将Vis与test相比较,若相等说明所有点都走过了.#include<iostream>#in

2021-02-09 14:32:32 284

原创 PTA 进阶实验4-3.4 笛卡尔树

PTA 进阶实验4-3.4 笛卡尔树题目链接思路:二叉搜索树的中序遍历的key值是从小到大有序排列的,用中序遍历遍历一次树得到中序遍历数组,检查数组是否是从小到大有序排列的,中序遍历的同时检查K2值,每次递归将K2值传入,与子树的K2作比较。代码如下:#include<cstring>#include<cstdio>#include<algorithm>#include<vector>using namespace std;const int

2021-02-07 18:02:40 268

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除