浏览全部代码:请戳

本文谨代表个人思路,欢迎讨论;)

1051. Pop Sequence (25)

题意

给定 stack 的容量,给定数据的入栈顺序:从 1 开始的正整数序列,在允许随机的出栈操作的情况下,要求判断某出栈序列是否可能。

比如,告知 stack 容量为 5,入栈序列的最大值为 7。有两个序列需要判断合理性:

  • {1 2 3 4 5 6 7}: 这个序列是可能的,只需每次入栈时都做出栈操作。
  • {3 2 1 7 5 6 4}: 这个序列是不可能的,其中前半部分 3 2 1 是合法的,先将 1 2 3 顺序入栈,然后三次执行出栈操作。而之后的 7 5 6 则是不可能的。

分析

两种思路:

第 1 种思路:

使用 stl 中的 stack 模拟。判定条件有两条:1.栈中数据量不超过栈的容量;2.出栈只能从栈顶取,不应该出现从固定的堆栈中取出其他数据的情况。

第 2 种思路:

由于入栈序列数据由小到大排列非常特殊,要通过出栈序列判定可能性是存在简便思路的。
对比分析题中 Sample 给出的序列,结合上面提到的两条冲突条件入手分析:

  • 1.栈中数据量不超过栈的容量:

    只有在入栈时,才会需要考虑栈中数据是否超量。出栈序列中的每个数,都以为着在出栈操作之前,它刚入栈,
    那么当它入栈的时候能否判定是否超过栈容量呢?可以的,(当前的出栈数值 - 已经执行过的出栈操作数量)就是当前栈中元素的数量。

  • 2.出栈只能从栈顶取,不应该出现从固定的堆栈中取出其他数据的情况。

    根据观察分析发现,当某数据 m 出栈之后,比 m 小的数据如果在 m 之后出栈的,它们所组成的序列本身需要保持从大到小的顺序排列。
    距离如 3 2 1 7 5 6 4 这个序列,在 7 之后有 5 6 4 这个子序列,它们都大于 7,但却没有保持一个递减的顺序,不合法。

更多分析参见博文《出栈序列的可能性判定》

1052. Linked List Sorting (25)

题意

链表的节点被表示为{地址, 值, 下一个指针地址},其中如果 NULL 的地址表示为-1,
地址为 5 正数,值的范围为[-105, 105]。

给定 N(< 105)个节点以及其头指针,要求按照每个节点上值的大小重新排序,并按照链表顺序输出每个节点。

分析

将链表中的节点按值做 qsort()排序,然后调整每个值的 next 指针即可。需要注意的有:

  • 1.INPUT 中的节点并不保证全是链表中的,先需要过滤掉悬空的节点。
  • 2.head 直接指向-1(NULL)的情况需要特殊处理。


1053. Path of Equal Weight (30)

题意

给定一棵树,有 N( <= 100) 个节点,每个节点有一个权重,另给定一个权重值 S(< 230)。要求找到从根节点出发到叶节点的路径上,所有点权重值和等于 S 的所有情况,并按照逆字典序输出。

分析

使用邻接表的方式构建树,dfs 搜索,由于需要逆字典序输出,处理前需要对每个节点的儿子节点邻接表进行排序,合理剪枝即可。

需要注意的是:结果路径要求以叶子节点结束。

1054. The Dominant Color (20)

题意

给定一个 M(<= 800)*N(<=600)个像素点,每个像素点的范围为 [0, 224],要求找出其中出现次数超过总数量的一半左右的点,称作 restrict dominant color.

分析

由于条件比较特殊,使用一个计数器count,一个寄存器color就可以实现对超过一半数目的选项的挑选。过程如下:

  • 1.count初始化为 0,color初始化为-1
  • 2.读入新的颜色值newColor,如果newColor跟寄存器的color一样,则计数器count加一。如果不一样,且count不为 0,则count减一;如果不一样,且count 为 0,则寄存器中的color被置为newColor
  • 3.不断循环 2,直到读入所有颜色值。这时候,寄存器color中存储的就是结果。

这个方法的巧妙之处,在于寄存器和计数器保存了状态,用抵消的思想,最终得到了较多数量的状态。思考时,不妨假设所有颜色值只有两个,一个是超过一半数量的 restrict dominant color,另一个则是少于一半数量的颜色,经过累加和寄存的操作,少于一半的颜色肯定会被多余一般的颜色抵消掉,最后剩下多于一半的颜色。另外,大家不妨想一下,本题的最后,计数器中的值就是 restrict dominant color 超过其他颜色的数量么?

1055. The World’s Richest (25)

题意

福布斯排行榜上,给出了 N(<=105)个人的名单,每个名单包含了不超过 8 个字符的姓名,(0,200]的年龄以及[-106,106]的财富值。

另外,给出了 K(<=103)次查询,以及每次查询要求的结果条数 M(<=100)。每次查询给定一个年龄区间,要求查询出这个区间范围内财富排名前 M 的人的名单。如果财富值相同,按姓名字典序排列。

分析

这道题时间限制比较严格。有两种思路:

第 1 种思路:
  • 1.所有年龄做 qsort()排序;
  • 2.分离到不同年轻的人的数组中,此时每个年龄中,都是排序好的。
  • 3.对于每个查询,从 2 中所得数组里进行归并排序,归并的每次比较过程,使用最大堆实现。
第 2 种思路:
  • 1.所有年龄做排序
  • 2.对排序好的年龄,每个年龄计数减掉 100 名之后的人。
  • 3.然后对待查询轮训过滤即可。

1056. Mice and Rice (25)

题意

分组淘汰赛背景。给出 Np(<=1000)个参赛者,限定每场比赛最多有 Ng(<=1000)个参赛者参加,如果一轮比赛中,组队的过程单出几个人,也将他们组成一次比赛。每场比赛决出一名胜者,参加到下一轮的淘汰赛中,而同一轮的负者都拥有相同的排名,如此循环往复,直到决出第一。

输入数据中还规定了必须依据顺序分组,而初始顺序体重已经给出。

分析

模拟题。用队列存储剩下的参赛队员,每轮比赛做一次循环,直到队列为空。处理一轮比赛时,负者的 rank 等于该轮比赛场次+1.换分组别的时候,需要仔细。

1057. Stack (30)

题意

在 stack 的基础上,增加了一个 PeekMedian 操作定义,要求输出 stack 中所有数据的中间大小的数。

题目给出 N(<=105)个对 stack 的顺序操作,要求输出操作结果。其中保证每次操作的值不大于 105。

分析

使用 stl 中的 stack 模拟常规栈操作,关键问题在于中位数的读取。由于时间限制比较严格,使用诸如优先队列等方式会超时。考虑到每次的操作数都不超过 105,想到诸如使用 hash 的方式用空间换时间。但即使是开一个int hash[100001]的 hash 表,也只能记录读入的所有数据的次数,无法提供高效的查询操作。实际上,在 hash 方式的前提下,使用树状数组能很好的解决这个问题。 (另有一篇详细介绍树状数组的译文:请戳

int hash[100001]建立树状数组,然后通过二分的方式,就可方便的查询到 hash 数组中那个坐标下的统计值处于中间位置,这个坐标的值也就是中位数了。

1058. A+B in Hogwarts (20)

题意

给定的数的结构如下:a.b.c,其中 a 的范围是 [0, 107],b 的范围是 [0,17),c 的范围是 [0,29)。给定两个数,要求计算他们的和。

分析

简单模拟题,有一个坑:题目交代最高位的区间为 [0, 100000000],但是没说如果两数相加超过这个值怎么办。需要将最高位的结果区间设定为 20000000 以上才 AC。

1059. Prime Factors (25)

题意

给定一个正整数,要求格式化输出它的素因数相乘的形式。

分析

由于时间限制,不可以简单的重复判定素数。可以使用 DP 的思想做素数的判定。

1060. Are They Equal (25)

题意

科学计数法相关背景。假设机器只能存储 3 个有效数字,那么1230012358.9在机器侠都表达都为0.123*10^5,他们相等。其中有效数字使用简单截尾方式,不进位。

给定两个不大于 10100 的非负整数,以及有效位数 N(<=100),要求计算在对应的精确位数下,两数的表达是否相等。

分析

由于非负整数非常大,不可使用 longlong 甚至精确度不高的 double,当做字符串来处理。

需要注意的一点是对值为 0 的情况的处理。比如 0 在有效位数为 3 下的表达为:0.00*10^0

 原文地址:http://biaobiaoqi.github.com/blog/2013/08/01/pat-1051-1060-solutions/
 版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0

PAT 1051-1060 题解的更多相关文章

  1. PAT甲题题解-1051. Pop Sequence (25)-堆栈

    将1~n压入最多为m元素的栈 给出k个出栈序列,问你是否能够实现. 能输出YES 否则NO 模拟一遍即可,水题. #include <iostream> #include <cstd ...

  2. PAT甲题题解-1060. Are They Equal (25)-字符串处理(科学计数法)

    又是一道字符串处理的题目... 题意:给出两个浮点数,询问它们保留n位小数的科学计数法(0.xxx*10^x)是否相等.根据是和否输出相应答案. 思路:先分别将两个浮点数转换成相应的科学计数法的格式1 ...

  3. PAT Basic 1060

    1060 爱丁顿数 英国天文学家爱丁顿很喜欢骑车.据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E.据说爱丁顿自己的 E 等于87. 现给 ...

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

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

  5. PAT 甲级 1060 Are They Equal (25 分)(科学计数法,接连做了2天,考虑要全面,坑点多,真麻烦)

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...

  6. PAT 乙级 1060 爱丁顿数(25) C++版

    1060. 爱丁顿数(25) 时间限制 250 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 英国天文学家爱丁顿很喜欢骑车.据说他 ...

  7. PAT 1051 复数乘法(15 )(代码+思路)

    1051 复数乘法(15 分) 复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i​2​​=−1:也可以写成极坐标下的指数形式 (R×e​(Pi)​​),其 ...

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

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

  9. PAT甲题题解-1108. Finding Average (20)-字符串处理

    求给出数的平均数,当然有些是不符合格式的,要输出该数不是合法的. 这里我写了函数来判断是否符合题目要求的数字,有点麻烦. #include <iostream> #include < ...

  10. PAT甲题题解-1128. N Queens Puzzle (20)-做了一个假的n皇后问题

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789810.html特别不喜欢那些随便转载别人的原创文章又不给 ...

随机推荐

  1. RMQ问题-ST方法

    参考 http://blog.csdn.net/sdj222555/article/details/7875575 RMQ 就是 Range Minimum/Maximum Query 就是求区间最值 ...

  2. linux进入root模式

    sudo su 然后输入密码 然后就会进入root模式,,,前面的提示符变成#

  3. 【u252】泽泽在巴西

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 泽泽帮助了英国某街道尽量减少酸雨的伤害,街道办主任非常感激他,就把他领到一扇门前,告诉他这扇门能通往好 ...

  4. Hadoop读书笔记(四)HDFS体系结构

    Hadoop读书笔记(一)Hadoop介绍:http://blog.csdn.net/caicongyang/article/details/39898629 Hadoop读书笔记(二)HDFS的sh ...

  5. HDU 1213 How Many Tables 并查集 水~

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 果然是需要我陪跑T T,禽兽工作人员还不让,哼,但还是陪跑了~ 啊,还有呀,明天校运会终于不用去了~耶耶耶 ...

  6. [React] Use React.cloneElement to Modify and Add Additional Properties to React Children

    In this lesson we'll show how to use React.cloneElement to add additional properties to the children ...

  7. 对延时敏感的应用是否应该使用Docker?

    在High Scalability上看到一篇文章 How Does The Use of Docker Effect Latency? .文章回答了一个问题 I keep hearing about ...

  8. Android入门——Bitmap和BitmapFactory

    我们都知道一个App的成败,首先取决于是否具有优秀的UI,而除了交互功能之外还需要丰富的图片背景和动画去支撑.在开发中我们应用到的图片不仅仅包括.png..gif..9.png..jpg和各种Draw ...

  9. 我的前端规范——HTML篇

    相关文章 简书原文:https://www.jianshu.com/p/a46ff0504982 我的前端规范——开篇:http://www.cnblogs.com/shcrk/p/9271561.h ...

  10. javascript中定义事件的三种方式 分类: C1_HTML/JS/JQUERY 2014-08-07 10:27 634人阅读 评论(0) 收藏

    在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 3.在javascipt中,使 ...