这次的题目来源是 2013 年 10 月 7 日下午的浙大计算机研究生招生机试题。

这次题目的难度,按姥姥的说法是:『比普通的 PAT 要难了 0.5 个点。我是把自己的题目从 1.0 到 5.0 以 0.5 的间距分难度级别的,PAT(A)难度一般在 1.5-4.5 之间,保研考试一般在 2.0-5.0 之间。PAT(B)大概是 1.0-2.5 的难度。』。

个人认为,其中 1066 模拟 AVL 插入的实现有些细节容易弄错,而 1068 只要会简单的 DP,也就没有问题了,1065 和 1066 都还是很简单的实现。

下面是各个题的分析(PAT advanced level 本人实现的全部源码:请戳)。

1065. A+B and C (64bit) (20)

题意

输入三个数 a,b,c,取值范围是 [-2^63, 2^63],要求判断a + b < c 是否为真。

分析

很简单的签到题,想到两种方法:一是用 Java 的 Big Decimal 实现(应该不会超时吧-,-),二是对 a+b 造成的 long long 溢出的情况做特殊处理。

对于分情况的实现方式,实际上也就两种特殊情况,即 a,b 同号且两者之和溢出了(绝对值超过了 263)。此时两者之和与 c 的值的相对关系也是确定的。

  • a < 0 && b < 0 && a + b >= 0: a + b 必小于 c
  • a > 0 && b > 0 && a + b <= 0: a + b 必大于 c

另在 98 看见有大神说可以用 long double 水过去-,-.

pat1065 源码:请戳

1066. Root of AVL Tree (25)

题意

实现 AVL 树的插入方法,给定 N(<=20)个数,要求输出依次插入后的 AVL 树的根。

分析

由于节点少,可以使用相对简单的递归实现方法:

  • 每个节点维护一个高度值,用在递归插入后检测子树是否平衡
  • 完成 4 个旋转方法(参见 AVL Tree wikipedia 中的示意图)
  • 在递归插入方法中,完成对子树的插入后,检测子树高度差,根据子树的结构特点,做出相应的旋转
  • 旋转后记得更新节点的高度值

机试时似乎没有人完全 AC 这道题,看来代码实现和 Debug 能力缺乏还是比较普遍的问题。

pat1066 源码:请戳

1067. Sort with Swap(0,*) (25)

题意

给定 N(<=10^5)以及一个{0,1,…,N-1}的打乱的数列。

定义了一种交换方式:Swap(0,*),表示将 0 和任意数进行位置交换。

限定只能使用Swap(0,*),要求输出最少需要多少次交换操作,来完成整体的排序。

分析

很好玩的模拟题,从题目的两个测试数据入手,找到所需要的交换次数的特点:

假设用数组 a 存储输入的数组,数组的坐标为 [0, N - 1],而元素的所有值也是 [0, N - 1]。

  1. 输入的序列中本就在自己位置上的数字,是不用被交换的(比如序列{4, 0, 2, 1, 3}中 2 就是不用被交换),0 除外

  2. 0 最终肯定会被放回到 0 的位置上,但交换过程中,0 也可能被提前交换到了 0 的位置上,此时还有其他数没有处于正确的位置上(参见 Sample Input{10 3 5 7 2 6 4 9 0 8 1}的情况)。此时需要多费一步将 0 和某一个处于不正确位置的数交换位置,来继续排序。

  3. 每次的交换,0 其实只是一个过渡作用。实际的交换过程遵循的链式关系如下所述:设定 a[x] == b, 而 b != x,则需要将 a[x]的值移动到 a[b]上,此时 a[b] == c, 那么接着又需要将 a[b]的值移动到 a[c]上,以此类推,肯定能获得一个循环,且节点数 M 小于等于 N。如果循环中包含了 0,那么这个循环中的数排序所需要的交换次数为 M - 1, 如果循环中不包含 0,那么首先需要一次交换将 0 移动到循环链中,此时整个循环链节点数增加了 1,于是共需要开销 M + 1 次交换。

  4. 根据 3 的分析,在 2 的情况下,0 与不同的不在正确位置的数的交换,是不会影响最终的结果的。

综上所述,用类似 dfs 或者并查集的思路找到集合中的所有循环链路,记录下他们的大小,即可计算出所需要的交换次数。

pat1067 源码:请戳

1068. Find More Coins (30)

题意

给定 N(<=10^4) 枚硬币和一个价格 M(<=100)。

要求用这 N 枚硬币组合出价格 M,如果有多种组合,输出排序后硬币面值字典序最小的组合,如果没有组合,则输出 No Solution.

分析

裸背包问题,相关资料参见 dd 大神的总结:《背包问题九讲》

按照常规的背包思路,构建 10001 * 101 的二维数组 f[i][j],状态 f[i][j] 表示前 i 枚硬币能拼凑出的小于等于 j 的最大值(j 这里代表一个价格)。

状态转移方程为:f[i][j] = max(f[i - 1][j], f[i - 1][j - c[i]] + c[i]), 其中 c[i]为第 i 枚硬币的面值,c[i]为排序过的硬币面值数组。

由于最终的输出要求是排序的币值的字典序最小的组合,可以对 c[i]做从大到小的排序,并另开一个数组 has[i][j] 来记录当前状态下,是否有包含 c[i]。同时注意,当f[i - 1][j] == f[i - 1][j - c[i]] + c[i]时,采纳当前的 c[i],以满足字典序。

pat1068 源码:请戳

 原文地址:http://biaobiaoqi.me/blog/2013/10/08/pat-1065-pat-1068/
 版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0

PAT 1065 - 1068 题解的更多相关文章

  1. PAT 1065 1066 1067 1068

    pat 1065 A+B and C                                          主要是注意一下加法溢出的情况,不要试图使用double,因为它的精度是15~16 ...

  2. PAT甲题题解-1068. Find More Coins (30)-dp,01背包

    一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...

  3. PAT甲题题解-1065. A+B and C (64bit) (20)-大数溢出

    第一眼以为是大数据,想套个大数据模板,后来发现不需要.因为A.B.C的大小为[-2^63, 2^63],用long long 存储他们的值和sum. 接下来就是分类讨论:如果A > 0, B & ...

  4. PAT 1065 A+B and C[大数运算][溢出]

    1065 A+B and C (64bit)(20 分) Given three integers A, B and C in [−2​63​​,2​63​​], you are supposed t ...

  5. PAT Basic 1068

    1068 万绿丛中一点红 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 ...

  6. 2019秋季PAT甲级_C++题解

    2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...

  7. PAT 甲级 1068 Find More Coins (30 分) (dp,01背包问题记录最佳选择方案)***

    1068 Find More Coins (30 分)   Eva loves to collect coins from all over the universe, including some ...

  8. PAT 1065 A+B and C (64bit) (20)

    1065. A+B and C (64bit) (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 HOU, Qiming G ...

  9. PAT甲级1068 Find More Coins【01背包】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805402305150976 题意: n个硬币,每一个有一个特有的价 ...

随机推荐

  1. 参数传递方法(用Delphi的汇编代码解释)

    参数传递方法 李纬的InsideVCL<第一章>中提到Windows定义的回调函数 typedef LRESULT (CALLBACK*WNDPROC)(HWND,UNIT,WPARAM, ...

  2. linux中关闭程序或进程

  3. ArcSDE中空间数据的备份与恢复

    在采用文件形式空间数据的时代,空间数据的备份仅仅是操作系统中的文件拷贝.备份和归档的过程:而空间数据的恢复也不过是复制.覆盖的操作:在基于ArcSDE和关系型数据库的空间数据库时代,空间数据的备份更多 ...

  4. [Angular] Configurable Angular Components - Content Projection and Input Templates

    We are going to have a modal component: <au-modal > </au-modal> And we can pass default ...

  5. widow下svn上传项目时的文件可执行权限问题

    还是项目上发现的问题,要上传Android的源码项目.这里客户端是windows的机器, 测试后发现俩个问题. 1. 文件后缀是.so的文件默认上传不了.    2. 文件后缀是.sh的文件,上传后, ...

  6. SetForegroundWindow

    SetForegroundWindow 函数功能:该函数将创建指定窗口的线程设置到前台,并且激活该窗口.键盘输入转向该窗口,并为用户改各种可视的记号.系统给创建前台窗口的线程分配的权限稍高于其他线程. ...

  7. hdu 3306 Another kind of Fibonacci(矩阵高速幂)

    Another kind of Fibonacci                                                        Time Limit: 3000/10 ...

  8. Deep Learning for Nature Language Processing --- 第四讲(下)

    A note on matrix implementations 将J对softmax的权重W和每一个word vector进行求导: 尽量使用矩阵运算(向量化).不要使用for loop. 模型训练 ...

  9. 选择标识符(identifier)

    整数通常是标识列最好的选择,因为它们很快并且可以使用auto_increment:千万不要使用enum和set类型作为标识列:尽量避免使用字符串类型作为标识列,因为他们很消耗空间,并且通常比数字类型慢 ...

  10. JavaScript对象的创建

    原文 简书原文:https://www.jianshu.com/p/6cb1e7b7e379 大纲 前言 1.简单方式创建对象的方法 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对 ...