PAT 1001-1010 题解
早期部分代码用 Java 实现。由于 PAT 虽然支持各种语言,但只有 C/C++标程来限定时间,许多题目用 Java 读入数据就已经超时,后来转投 C/C++。浏览全部代码:请戳
本文谨代表个人思路,欢迎讨论;)
1001. A+B Format (20)
题意
格式化输出两数之和。
分析
理清输出逻辑即可。
1002. A+B for Polynomials (25)
题意
给定两多项式,相加并格式化输出结果。
分析
两种思路
- 1.采用链表的处理方式;
- 2.预设好 int[1005]的数组,用下标表示次方,数组中元素值表示对应系数。
第一种方法某种程度上看能节省空间,实现上需要注意操作链表时,循环时的越界问题;
方法二用空间换取时间,且实现上更不容易出错。同时,由于浮点数本身精确位数不够,在判定两浮点数相加是否为 0 时,
需要对结果值取绝对值后,与 1e-6 做对比。
1003. Emergency (25)
题意
求两个城市之间的加权最短路径。在有多个最短路径记录的情况下,选择路径中所有节点的权重值之和最小的。
分析
Dijkstra 算法的变型实现。两种思路:
- 1.计算最短路时,在每个节点上用链表 preList 记下所有最短路径的前节点。
完成计算后,对 preList 做 dfs 获得每条最短路径的权重值之和,比较后得到结果; - 2.计算最短路径时,在节点上,除了记录最短路径中前一个节点 preNode 之外,还对应的记录当前的最短路径上所有节点的权重值之和,
这就不用在 Dij 完成之后再做 dfs 了,过程中已经找到了最优解。
相比之下,方法 2 明显更简洁。当然,虽然方法 2 的思路很通用,还需要确定,这一加权的判定条件是能够迭代处理的。
1004. Counting Leaves (30)
题意
计算给定的树各个层级叶子节点的个数
分析
先构建树,鉴于题目的空间限制不严格,可以使用邻接矩阵的方式定义树结构。然后使用 dfs 遍历树的节点,并记录每层的叶子节点数量。
可以看到,时间空间的 trade-off 不仅仅是性能上的提升,也会影响带代码实现的复杂程度。
1005. Spell It Right (20)
题意
计算一个数(<=10100)的各个位数之和,并用英语按位输出。比如 15 输出为 one five.
分析
简单题,输出的实现上实际上就用到了 Hash 思想。
1006. Sign In and Sign Out (25)
题意
每个人来到实验室和离开实验室的时间都有记录。找到其中最早来实验室和最晚离开实验室的时间。
分析
逻辑上很简单的一个题,遍历所有数据,找到其中最大和最小的值即可。稍微要处理的就是时间。
由于 input 中给出的是 HH:MM:SS 的格式,在比较时需要将其换算为 int 值。实际上,使用 C 语言读入更方便,scanf("%d:%d:%d", &h, &m, &s);
然后计算出time = 3600*h + 60*m + s,时间比较就没有问题了。在最终的输出时再做对应的转换即可。
而在 Java 语言中,使用到了 String 的 split 方法划分子串和 Integer.parseInt()转 String 为 int。
1007. Maximum Subsequence Sum (25)
题意
给出一组由正负整数组成的序列,求出拥有最大和的连续子序列。
分析
最暴力的算法是两个循环的 O(n2);进一步要使用分治的思想,可以得到 O(n*logn);更好的方法可以达到 O(n),也可以将它看做分治思想。关键在于数学归纳的证明,编程实现非常简单:假定 [0, n-1]的最大连续子串已经求出了,要求 [0,n]的最大连续子串。
- 1.如果 [0, n-1]中最大子串不包含最右的数字,则判定
原最大子串的和与包含最右点的最大子串 + a[n]的和的大小。取大的那个作为 [0, n]的最大子串,并保持一个包含最右点的最大子串。 - 2.如果 [0, n-1]中最大子串包含最右的数字,则 [0, n]的最大子串为原最大子串+a[n]。
实际上,算法的核心是维持了两个量的记录,即当前的最大子串,以及当前包含最右点的最大子串。
更多讨论参见博文《分治、时间空间的权衡:最大合的连续字串问题 (PAT 1007)
》
1008. Elevator (20)
题意
给出电梯的行进路径,上下的速度和每层停留时间,计算总时间。
分析
简单的模拟题。
1009. Product of Polynomials (25)
题意
求两个多项式的乘积。
分析
参见 PAT1002,使用数组存储虽然空间占用稍大,但比链表实现要便捷很多。
1010. Radix (25)
题意
给定两个数,其中单个位置上的数值范围可以为 [0-z]。指定其中一个数的进制,试确定是否存在可能的进制让两数的实际值相等。
分析
此题没有交代清楚 input 中 radix 的取值范围以及对一位数有多重可能 radix 的情况如何输出,坑比较大。下面是需要注意的点。
- 1.input 中两个数字可以是 10 位数,虽然没有告诉 radix 的范围,但在
9*10^10 10 1 200这个示例中,可以看到结果的 radix 也可以是很大的。从这个角度看,代码中将 radix 和两个数值都设定为 longlong 是合适的选择。 - 2.在计算另一个数的 radix 时,简单的遍历 [2, 1018]会超时。单调的区间很自然想到使用二分查找。
- 3.二分查找的上下界确定能减少耗时:下界选数字的所有位上的最大值+1;上界容易想当然的认为就是题中给定了 radix 的数的值。实际上,示例
11 b 1 10就是一个反例,原因在于这个假设忽略了一位数的可能性,解决方案是在取给定 radix 的数值和下界中较大的那个数。 - 4.在二分查找时,不可直接计算出某个 radix 下数的值,因为可能会 longlong 溢出。于是需要用特定的 compare 函数,在累加的过程中判定是否大于另一个数。算是一种剪枝。
- 5.还有一个条件:当两个数都是 1 时,输出 2.当两个数相等且不为 1 时,输出题中给出的 radix。(这是从其他人的结题报告中看到的,完全不理解=。=)
注意好这些方面,应该能 ac 了。保重。
原文地址:http://biaobiaoqi.github.com/blog/2013/07/31/pat-1001-1010-solutions/
版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
PAT 1001-1010 题解的更多相关文章
- PAT 1001 A+B 解题报告
PAT 1001 A+B 代码链接:传送门 题目链接:传送门 题目简述: 给定两个值a,b: 范围-1000000 <= a, b <= 1000000: 按指定格式输出a+b的结果,例: ...
- PAT甲级1010. Radix
PAT甲级1010. Radix (25) 题意: 给定一对正整数,例如6和110,这个等式6 = 110可以是真的吗?答案是"是",如果6是十进制数,110是二进制数. 现在对于 ...
- PAT 乙级 1010
题目 题目地址:PAT 乙级 1010 思路 首先一个问题就是审题不清,导致代码返工了很多次,最后还没写对: 其次对于这道题来说每次输入一组数据之后就可以输出结果,太过机械地想要套用题目给出的输出样例 ...
- PAT甲题题解-1001. A+B Format (20)-字符串处理,水
计算A+B的和,并且按标准格式处理,每3个就要有个逗号 #include <iostream> #include <cstdio> #include <algorithm ...
- PAT甲题题解-1010. Radix (25)-二分搜索
题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等.不存在的话,则输出Impossible 这题思路很简单,但是要考虑的比较多,在简单题里面算是比较好的. 有两 ...
- 2019秋季PAT甲级_C++题解
2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...
- 【PAT】1010. 一元多项式求导 (25)
1010. 一元多项式求导 (25) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数 ...
- PAT Basic 1010
1010 一元多项式求导 设计函数求一元多项式的导数.(注:x^n^(n为整数)的一阶导数为n*x^n-1^.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数). ...
- PAT乙级 1010. 一元多项式求导 (25)
1010. 一元多项式求导 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 设计函数求一元多项式的导数.(注:xn(n为整数)的一 ...
- PAT 1001
Calculate a + b and output the sum in standard format -- that is, the digits must be separated into ...
随机推荐
- APP功能点测试
一.移动互联网特点: 1,用户体验至上:精准的用户体验 2,核心竞争力:市场占有率和业务创新能力 3,营销模型:通过口碑传播吸引客户,随之参与互动(如分享等,对接口测试要求高) 二.项目特点: 1,开 ...
- Python内部机制-PyObject对象
PyObject对象机制的基石 学过Python的人应该非常清晰,Python中一切都是对象,全部的对象都有一个共同的基类,对于本篇博文来说,一切皆是对象则是探索Python的对象机制的一个入口点.我 ...
- C#利用反射机制,获取实例的属性和属性值
C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();// ...
- POJ 1595 Prime Cuts (ZOJ 1312) 素数打表
ZOJ:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=312 POJ:http://poj.org/problem?id=159 ...
- springboot下静态资源的处理(转)
在SpringBoot中有默认的静态资源文件相关配置,需要通过如下源码跟踪: WebMvcAutoConfiguration-->configureResourceChain(method)-- ...
- 在 AppDelegate 设置屏幕切换
//禁止横屏显示 - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWin ...
- [TypeStyle] Add type safety to CSS using TypeStyle
TypeStyle is the only current CSS in JS solution that is designed with TypeSafety and TypeScript dev ...
- CleanCode代码整洁之道培训总结(2015-03-14)
为期四天的CleanCode培训时间非常短.非常难准确掌握一些知识.但让我对代码有了一个又一次的认识和启示:之前也有看过设计模式.重构之类的书,看完之后也有一些感触,过后在写代码中还是不能应用进来,事 ...
- 如何用Swift创建一个复杂的加载动画
现在在苹果应用商店上有超过140万的App,想让你的app事件非常具有挑战的事情.你有这样一个机会,在你的应用的数据完全加载出来之前,你可以通过一个很小的窗口来捕获用户的关注. 没有比这个更好的地方让 ...
- [Ramda] allPass, propEq
const needs = ['wifi', 'shower', 'laundry']; const homes = [{ name: 'Home 1', wifi: 'y', shower: 'y' ...