早期部分代码用 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 题解的更多相关文章

  1. PAT 1001 A+B 解题报告

    PAT 1001 A+B 代码链接:传送门 题目链接:传送门 题目简述: 给定两个值a,b: 范围-1000000 <= a, b <= 1000000: 按指定格式输出a+b的结果,例: ...

  2. PAT甲级1010. Radix

    PAT甲级1010. Radix (25) 题意: 给定一对正整数,例如6和110,这个等式6 = 110可以是真的吗?答案是"是",如果6是十进制数,110是二进制数. 现在对于 ...

  3. PAT 乙级 1010

    题目 题目地址:PAT 乙级 1010 思路 首先一个问题就是审题不清,导致代码返工了很多次,最后还没写对: 其次对于这道题来说每次输入一组数据之后就可以输出结果,太过机械地想要套用题目给出的输出样例 ...

  4. PAT甲题题解-1001. A+B Format (20)-字符串处理,水

    计算A+B的和,并且按标准格式处理,每3个就要有个逗号 #include <iostream> #include <cstdio> #include <algorithm ...

  5. PAT甲题题解-1010. Radix (25)-二分搜索

    题意:给出n1和n2,以及其中一个数的进制,问另一个数是多少进制的情况下,才会是两个数相等.不存在的话,则输出Impossible 这题思路很简单,但是要考虑的比较多,在简单题里面算是比较好的. 有两 ...

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

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

  7. 【PAT】1010. 一元多项式求导 (25)

    1010. 一元多项式求导 (25) 设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为n*xn-1.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数 ...

  8. PAT Basic 1010

    1010 一元多项式求导 设计函数求一元多项式的导数.(注:x^n^(n为整数)的一阶导数为n*x^n-1^.) 输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数). ...

  9. PAT乙级 1010. 一元多项式求导 (25)

    1010. 一元多项式求导 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 设计函数求一元多项式的导数.(注:xn(n为整数)的一 ...

  10. PAT 1001

    Calculate a + b and output the sum in standard format -- that is, the digits must be separated into ...

随机推荐

  1. Maven学习总结(16)——深入理解maven生命周期和插件

    在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最近实在受不了乌龟一样的b ...

  2. 安装hadoop2.6.0伪分布式环境 分类: A1_HADOOP 2015-04-27 18:59 409人阅读 评论(0) 收藏

    集群环境搭建请见:http://blog.csdn.net/jediael_lu/article/details/45145767 一.环境准备 1.安装linux.jdk 2.下载hadoop2.6 ...

  3. 【z08】乌龟棋

    描述 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个格子上一个分数(非负整数).棋盘第1格是唯一的起点,第N格是终点,游戏要求玩家控制一个乌龟棋子从起点出发走到终点 ...

  4. 机器学习算法笔记1_2:分类和逻辑回归(Classification and Logistic regression)

    形式: 採用sigmoid函数: g(z)=11+e−z 其导数为g′(z)=(1−g(z))g(z) 如果: 即: 若有m个样本,则似然函数形式是: 对数形式: 採用梯度上升法求其最大值 求导: 更 ...

  5. [Javascript] Validate Data with the Every() Method

    The every method returns true or false based on whether or not every item in the array passes the co ...

  6. [Angular2 Form] patchValue, setValue and reset() for Form

    Learn how to update part of form model, full form model and reset whole form. We have form definetio ...

  7. Uploadify404无效链接

    Uploadify404无效链接 在使用Jquery Uploadify插件的時候.会发如今请求中有个返回值为404的请求. 假如如今的location为www.aa.com/bugs/more. h ...

  8. [GraphQL] Deploy a GraphQL dev playground with graphql-up

    In this lesson we'll use a simple GraphQL IDL schema to deploy and explore a fully functional GraphQ ...

  9. 【cocos2dx 3.2】瓦片地图制作

    使用Tiled编辑地图 每个图层仅仅能放一种瓦片 瓦片的大小最好是32*32的倍数 对象层里面设置路径的坐标 主程序中获取对象层中的坐标,做对应的操作 设置口袋精灵类: Monster.h #incl ...

  10. 【codeforces 760B】Frodo and pillows

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...