大二《数据结构》机考解题报告

这次学校数据结构机考,题目很奇怪,简直让我觉得这是算法考试……三道题,撑死了用到树的遍历和并查集,连个队列都没用,也是醉了-.-

第一题 高精度加法

   两个数相加,数最多5000位,也就是和最多5001位,而且连数的长度都会给。直接两个数组相加就好。

第二题 给出树的前序、中序遍历,要求写出树的后序遍历。

   一棵树,若知道两种遍历,且其中一种是中序遍历,那么必然可以确定下这棵树,自然也可以求出第三种遍历。而这道题中,树最多有26个点(还是52个?记不清了),这就是告诉我们:你们随便搞吧,别进死循环就不会超时~~因此,我们只需要在纸上手动操作一下样例,看看如何构造出这棵树,然后用计算机搞定这个过程,最后后序遍历一下就好了。

第三题 给出两个N×M的矩阵,问只通过交换两行和交换两列,是否可以从其中一个矩阵构造出另一个。

分析一下这两种操作,以交换两行为例:操作过程中,原来是一行的那些元素,换完了还是在一行;原来是一列的那些元素,现在还是在一列。而且,还可以想到,一旦满足这个条件,那么这两个矩阵一定可以互相构造出来,证明略。(因为这个很明显是对的,但是我暂时只能想到很麻烦的证明方法,所以就先不写了,等我想到很简洁漂亮的方法,会在此更新的。)因此,我们只要去判断这个就好了:A矩阵中随便取一行元素,在B矩阵中找相同的元素,应当也是在同一行;列同上。我暂时想到的有两种方法——

方法一:并查集。在此只说行如何做,列的类似就好了。我们首先初始化并查集,然后扫一遍A矩阵,一行一行扫,把每行的所有数都合并到同一个集合。这样搞完,两个数如果在同一个集合中,则说明他们在A中处于同一行。此时,我们再扫一遍B矩阵,也是一行一行扫,每一行的数据判断下是否都在同一个集合中(判断方法随意,保证线性即可,当然此题数据太小,此处平方级别也可以过),这样如果全都合法,就说明B中在同一行的数据,在A中也处于同一行。如此这般,行列都做完,都合法,也就可以输出Yes了,否则中间直接跳出输出No便可。应当注意的是,题目本身保证了一个矩阵中没有相同的数,在此条件之下,上面判断过程如果都满足,则说明两矩阵中的元素完全一样,这个无需单独判断。

方法二:存映射。如果你不想用并查集,比如你想提高效率(毕竟并查集的复杂度不是O(1)而是O(α)嘛-.-),或者觉得并查集代码太麻烦(毕竟有四五行-.-),那么你可以考虑详细一些。其实,我们只需要做到下面这样就足够了:对于A矩阵中的任意一个数,都可以瞬间找到其在B矩阵中的位置。这种思路下,我们只要扫一遍B,存一个下标0~10000的数组siteB(元素的范围是0~10000),数组中的元素是坐标(i,j),其意义为:siteB[x]表示x在B中的位置。而后,我们扫一遍A矩阵,一行一行扫,利用siteB数组,判断每行元素在B中是否也位于同一行。至此,后面均同方法一,略。

    代码有时间补上。

时间: 2024-10-12 22:10:16

大二《数据结构》机考解题报告的相关文章

2020年南大软院机考建议附前两年机考夏令营真题

去年夏令营机考,两个小时时限,有一道面向对象题目和算法题目,面向对象较为简单,算法难度等于LeetCode简单.中等难度的试题,评分是学院自己的测试用例(同学不可见,因为是上传服务器的),同学可以多次上传查看分数. 建议: 1.下载我的网盘里的前两年夏令营真题,自己限制时间做一做.[免费的,只有题目] 2.训练自己的做题时间,多去LeetCode等刷中等难度题目. 3.语言只限Java.c++. 附件: https://pan.baidu.com/s/1lxl3284-Ijg26eyY_DBFI

2014哈商大ICPC/ACM校赛解题报告

被debug邀请去參加校赛,哎,被虐..我对不起工大.. 由于本人不搞ACM,算法处于HelloWorld水准.. 虽然题目除了鸟不拉屎星人之外都非常水,但我能做到这个程度,全然是超水平发挥了.. 数据:点此下载 ============================================================== a:逆序数组+删除特定元素 题目: 小伙伴们好像非常多没接触过ICPC,那先来一道水题尝尝鲜,给出 一个数组,和一个特征值.将这个数组中特征值值删除后逆序输出.

BZOJ 3809Gty的二逼妹子序列 解题报告+data marker

--BZOJ http://www.lydsy.com/JudgeOnline/problem.php?id=3809 考虑对l,r跑莫队,对一组维护美丽度出现次数的桶修改, 然后把桶序列用分块维护查询 然后是吐槽: 内存28M,哦,这个题居然卡内存..... 卡内存!!! 然后我就为本校的权限号贡献了三次MLE...... 代码: 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using st

ecnu18级程设实训第一次机考简易解题报告

愉快(并不)地考完了,看到LDY大佬的题解,决定学习一个,也来写一份解题报告.当然,这会是一个比较简易的版本,可能有所缺漏,敬请谅解. 此处是LDY大佬题解的传送门: https://zhuanlan.zhihu.com/p/60305621 走过路过给个赞~ A. 恢复单词 单点时限: 2.0 sec 内存限制: 512 MB 学霸在背单词的时候发现单词的大小写混乱,而且可能参杂了0-9的数字和 %,+,&,#这四种特殊符号.请编写程序让单词恢复正常.要求处理后单词的首字母大写,且其余字母均为

「十二省联考 2019」字符串问题 解题报告

「十二省联考 2019」字符串问题 当场就去世了,我这菜人改了一下午 考虑一个A,B之间的连边实际表示了两个A之间的有向边,然后把A的连边处理好,就转成了拓扑排序找环+最长链 但是边数很多,考虑优化连边 A,B之间的连边显然没法优化的,考虑一个B可以表示所有它的后缀A 把串反向建出SAM,然后一个B的后缀就是par树的子树 可以拿倍增定位 好了这题就没了 注意到一个事情,定位的点可能重复,于是对SAM拆点,每个点挂一个vector表示一个A或者B的点在SAM的这个位置 然后考虑如何连边 一个B所

2014 UESTC暑前集训数据结构专题解题报告

A.Islands 这种联通块的问题一看就知道是并查集的思想. 做法:从高水位到低水位依序进行操作,这样每次都有新的块浮出水面,可以在前面的基础上进行合并集合的操作.给每个位置分配一个数字,方便合并集合.同时将这些数字也排一个序,降低枚举的复杂度.合并集合时向四周查询浮出水面但是没有合并到同一集合的点进行合并. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath&

POJ 1001 解题报告 高精度大整数乘法模版

题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于错误的判断还不够严厉. 对边界情况的讨论其实应该是思维严密的表现,当然这并不能表明我写的一点错误都没有,只是多多分析一下还是很有好处的. #include <iostream> #include <fstream> #include <string> #include &l

解题报告:LeetCode The Skyline Problem(画天际

题目出处:https://leetcode.com/submissions/detail/47013144/题意描述: 给定一系列矩形的左边坐标Li,右边坐标Ri,和高度Hi(其中Li按照从小到大的顺序排列).代表城市中一座座高楼.求这些矩形代表的高楼行成的天际线.天际线的定义为:在远处看这些所有的高楼时看到的轮廓. 数据输入: [ [L1, R1, H1], [Li, Ri, Hi]...]为元素类型为三维向量的向量,其中Li,Ri,Hi的含义见题意描述.且输入数据保证: 0 ≤ Li, Ri

2016.8.25 NOIP2012 day1 解题报告

考试总结: 1.  显然第一道送分题,我差一点直接打表来对拍了,后来发现我们的pdf有问题不能复制,并且我没有YJQ大神那样足够的时间每道题都对拍,就只能试过样例就遁,(其实这种密码我玩过,密码学入门密码,当时好像叫凯撒密码233):对了,ASCII的掌握也很重要,我之前一直以为大写在小写后面啧.(之间漏掉过大于以后减的步骤,这种简单题还是做少了居然耗了30min,以后好好检查争取一次过): 2.  这道题我拿到的第一反应就是贪心,马上想了一个贪心规则但自己总觉得是错的,花了很长的时间举反例举不