PAT 1051-1060 题解
浏览全部代码:请戳
本文谨代表个人思路,欢迎讨论;)
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
减一;如果不一样,且coun
t 为 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 个有效数字,那么12300
和12358.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 题解的更多相关文章
- PAT甲题题解-1051. Pop Sequence (25)-堆栈
将1~n压入最多为m元素的栈 给出k个出栈序列,问你是否能够实现. 能输出YES 否则NO 模拟一遍即可,水题. #include <iostream> #include <cstd ...
- PAT甲题题解-1060. Are They Equal (25)-字符串处理(科学计数法)
又是一道字符串处理的题目... 题意:给出两个浮点数,询问它们保留n位小数的科学计数法(0.xxx*10^x)是否相等.根据是和否输出相应答案. 思路:先分别将两个浮点数转换成相应的科学计数法的格式1 ...
- PAT Basic 1060
1060 爱丁顿数 英国天文学家爱丁顿很喜欢骑车.据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E.据说爱丁顿自己的 E 等于87. 现给 ...
- 2019秋季PAT甲级_C++题解
2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...
- 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 ...
- PAT 乙级 1060 爱丁顿数(25) C++版
1060. 爱丁顿数(25) 时间限制 250 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 英国天文学家爱丁顿很喜欢骑车.据说他 ...
- PAT 1051 复数乘法(15 )(代码+思路)
1051 复数乘法(15 分) 复数可以写成 (A+Bi) 的常规形式,其中 A 是实部,B 是虚部,i 是虚数单位,满足 i2=−1:也可以写成极坐标下的指数形式 (R×e(Pi)),其 ...
- PAT甲题题解-1068. Find More Coins (30)-dp,01背包
一开始没多想,虽然注意到数据N<=10^4的范围,想PAT的应该不会超时吧,就理所当然地用dfs做了,结果最后一组真的超时了.剪枝啥的还是过不了,就意识到肯定不是用dfs做了.直到看到别人说用0 ...
- PAT甲题题解-1108. Finding Average (20)-字符串处理
求给出数的平均数,当然有些是不符合格式的,要输出该数不是合法的. 这里我写了函数来判断是否符合题目要求的数字,有点麻烦. #include <iostream> #include < ...
- PAT甲题题解-1128. N Queens Puzzle (20)-做了一个假的n皇后问题
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789810.html特别不喜欢那些随便转载别人的原创文章又不给 ...
随机推荐
- 【例题 6-17 UVa 10562】Undraw the Trees
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟+递归 [代码] #include <bits/stdc++.h> using namespace std; con ...
- TTS-零基础入门之语音模板化
上篇介绍了TTS的一个简单样例http://blog.csdn.net/u010176014/article/details/47326413 本篇咱们进一步聊聊 语音怎样读模板. 比方 公交车上的模 ...
- php 获取隔日日期
php获取日期时间 <?php date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d&qu ...
- 【Codeforces Round #435 (Div. 2) B】Mahmoud and Ehab and the bipartiteness
[链接]h在这里写链接 [题意] 让你在一棵树上,加入尽可能多的边. 使得这棵树依然是一张二分图. [题解] 让每个节点的度数,都变成二分图的对方集合中的点的个数就好. [错的次数] 0 [反思] 在 ...
- ANDROID内存优化(大汇总——全)
写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在A ...
- 15、NAND FLASH驱动程序框架
驱动可以参考At91_nand.c,这个比S3c2410.c (drivers\mtd\nand)简单多了 NAND FLASH是一个存储芯片那么: 这样的操作很合理"读地址A的数据,把数据 ...
- MySql Order By 多个字段 排序规则
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xlxxcc/article/details/52250963 说在前面 突发奇想,想了解一下mysq ...
- SpringMVC+Spring+Mybatis+Mysql项目搭建
眼下俺在搭建一个自己的个人站点玩玩.一边练习.一边把用到的技术总结一下,日后好复习. 站点框架大致例如以下图所看到的: 眼下仅仅用到了SpringMVC+Spring+Mybatis+Mysql.把它 ...
- 自行实现透明的控件如Panel GroupBox(使用不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT属性)
CSDN的Blog开通了.我想这里的Blog作为今后自己回答别人问题的时候,收藏答案的地方很不错呢. 因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢. Q: http://commu ...
- pandas 时间序列分析(一)—— 基础
0. 以时间作为序列的索引 >> from datetime import datetime >> dates = [datetime(2011, 1, i) for i in ...