PAT 1065 - 1068 题解
这次的题目来源是 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 必小于 ca > 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]。
输入的序列中本就在自己位置上的数字,是不用被交换的(比如序列
{4, 0, 2, 1, 3}
中 2 就是不用被交换),0 除外0 最终肯定会被放回到 0 的位置上,但交换过程中,0 也可能被提前交换到了 0 的位置上,此时还有其他数没有处于正确的位置上(参见 Sample Input
{10 3 5 7 2 6 4 9 0 8 1}
的情况)。此时需要多费一步将 0 和某一个处于不正确位置的数交换位置,来继续排序。每次的交换,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 次交换。
根据 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 题解的更多相关文章
- PAT 1065 1066 1067 1068
pat 1065 A+B and C 主要是注意一下加法溢出的情况,不要试图使用double,因为它的精度是15~16 ...
- PAT甲题题解-1068. Find More Coins (30)-dp,01背包
一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...
- PAT甲题题解-1065. A+B and C (64bit) (20)-大数溢出
第一眼以为是大数据,想套个大数据模板,后来发现不需要.因为A.B.C的大小为[-2^63, 2^63],用long long 存储他们的值和sum. 接下来就是分类讨论:如果A > 0, B & ...
- PAT 1065 A+B and C[大数运算][溢出]
1065 A+B and C (64bit)(20 分) Given three integers A, B and C in [−263,263], you are supposed t ...
- PAT Basic 1068
1068 万绿丛中一点红 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的颜色与其周围 ...
- 2019秋季PAT甲级_C++题解
2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...
- 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 ...
- 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 ...
- PAT甲级1068 Find More Coins【01背包】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805402305150976 题意: n个硬币,每一个有一个特有的价 ...
随机推荐
- Day2:购物车小程序
一.购物车小程序第一版 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan product_list = [ (&quo ...
- (素材源代码) 猫猫学IOS(五)UI之360等下载管理器九宫格UI
猫猫分享,必须精品 先看效果 代码学习地址: 猫猫学IOS(五)UI之360等下载管理器九宫格UI 猫猫学IOS(五)UI之360等下载管理器九宫格UI http://blog.csdn.net/u0 ...
- Linux定时器的使用(三种方法)
使用定时器的目的无非是为了周期性的执行某一任务,或者是到了一个指定时间去执行某一个任务.要达到这一目的,一般有两个常见的比较有效的方法.一个是用linux内部的三个定时器,另一个是用sleep, us ...
- MongoDbHelper 帮助类(上)
在网上搜索mongodbHelper的帮助类时,出来的东西都大同小异,再此摘录一下. 这些代码也看了一遍,总是感觉重复的代码太多了,在后续的文章中又整合了一下,请看下篇,欢迎指正! using Sys ...
- 使用SystemC进行硬件仿真
使用SystemC进行硬件仿真 环境 linux-x86-64 bash g++ 下载解压SystemC SystemC下载地址 解压下载的包 tar zxvf systemc-2.3.3.tar.g ...
- [RxJS] BehaviorSubject: representing a value over time
When an Observer subscribe to a BehaviorSubject. It receivces the last emitted value and then all th ...
- DMA 如何查看它有没有传输完成 传输完成再开启
摘自:https://blog.csdn.net/zzwdkxx/article/details/9026173 /////////////////////////////////////////// ...
- HDU 1405 The Last Practice 数学水题
http://acm.hdu.edu.cn/showproblem.php?pid=1405 题目大意: 给你一个数,让你分解素因子,输出它的各次幂. 如60 输出:2 2 3 1 5 1 (60=2 ...
- VS2010下配置Opencv2.4.3 .
VS2008下OpenCV的配置过程在OpenCV论坛上写的很详细,具体过程可以见如下链接http://www.opencv.org.cn/index.php/VC_2008_Express%E4%B ...
- Android自定义组件系列【8】——遮罩文字动画
遮罩文字的动画我们在Flash中非常常见,作为Android的应用开发者你是否也想将这种动画做到你的应用中去呢?这一篇文章我们来看看如何自定义一个ImageView来实现让一张文字图片实现文字的遮罩闪 ...