PAT 1011-1020 题解
早期部分代码用 Java 实现。由于 PAT 虽然支持各种语言,但只有 C/C++标程来限定时间,许多题目用 Java 读入数据就已经超时,后来转投 C/C++。浏览全部代码:请戳
本文谨代表个人思路,欢迎讨论;)
1011. World Cup Betting (20)
题意
给定一个 3*3 的矩阵,找到每行的最大值,格式化输出一个运算结果。
分析
非常简单的模拟题。
1012. The Best Rank (25)
题意
给定学生的学号和三个科目的分数,查询输出对应学生单门科目排名和总分排名中最高的那个排名。
分析
C 里 stdlib.h 中的 qsort()和 C++里 algorithm 中的 sort()函数都能实现快排,应对编程题中的排序一般比自己手写的要快。
分别为三个单科和总分做排序,并将 rank 值记录到 map 结构中去,便于之后的查找。
需要注意并列排名的情况。比如1 2 2 4,由于并列第 2 的都两人,那之后的那个人就是第 4 而不是第 3 了。
另外,由于有多个需要分别排序、排名的项,抽象出公共逻辑到一个函数里比较必要,否则代码分散难于 debug 和维护。
这里稍微特殊点的用法是使用了函数指针做参数。
1013. Battle Over Cities (25)
题意
给定一张图和指定几个点。针对给出的每个点,要求计算,在除掉连接该点的路径的情况下,保证整个图连通所需要添加的边的数量。
分析
计算保证整个图连通需要几个点,亦即求出图中有几个连通分量。两种思路:
- 1.并查集
- 2.DFS
针对每个点,执行算法的过程中,需要注意去除掉该点对应的所有通路。
1014. Waiting in Line (30)
题意
这道题是排队模拟题。银行有 N 个窗口,每个窗口允许排队 M 个人,如果 N 个窗口占满了排队的人,更多的人需要在黄线外等待。
每个人都会选择尽可能人少的窗口排队,如果有多个窗口等待队列一样长,则选择编号小的窗口。
前 N 个用户设定在 8:00 开始接受服务。给定了 K 个用户所需要接受服务的时间长度,要求在这个排队模型下,每个人的完成处理的时间点。
分析
相对另外几个队列模拟题,这个题是很简单的。没有达到时间的差异,只需要不断的从等待队列中取出人员即可。
当然,由于黄线内等待的每个窗口都有 M 人,所以必须单独的模拟每个窗口。
可以使用 queue 模拟每个窗口,循环遍历下次离开窗口的人,继而从等待队列中补上。
需要注意结束条件,如果 17:00 以后还没有开始接受服务,则不用再等待。
1015. Reversible Primes (20)
题意
Reversible Primes 是指在某个进制下,一个数本身和它翻转过来形成的新数都是素数。
题中给出多组数据,以负数结尾程序。每组数据包含一个数以及一个进制数。判定该数是否是 Reversible Primes.
分析
两个功能点实现:判定素数和特定进制下的数据倒转。
1016. Phone Bills (25)
题意
给出一天中每个不同的小时内的电话付费标准,给出一份分为打出和挂断两种记录的通话记录,包括记录发生的时刻和用户名字,
要求整理出当月有效用户的账单,输出格式中需要输出所有的通话记录,包括开始时刻和结束时刻,每次通话的话费以及总计的话费。
分析
模拟题。首先对输入的通话记录按照先姓名后时间做 qsort()排序,然后遍历排序后的记录,找到合适的匹配对,计算每次通话的时间,并进行统计和输出。
实现的难点主要有两个:
- 1.在排序后的记录中,找到合适的配对。如果某人的通话记录为
1.on;2.on;3.off;,则其中1.on将被抛弃,匹配到2.on;3.off;。
题中仅仅保证了所有记录中至少有一对有效记录,但并没有保证每个人都有有效通话记录,所以还需要做好过滤,
如果某人没有有效通话记录,则不输出。整体的控制流程需要谨慎。 - 2.由于不同时刻的话费不一样,计算一次有效通话的话费比较复杂。可以采用的方式是用起始时刻分阶段追赶结束时刻。追赶的过程分阶段,也就能计算好不同阶段的开销,
先将起始时间调整到跟结束时间为同一天,细节是先让分钟达到 0,再让小时迭代到 0,天进位,一直迭代到跟结束时间同天;再让起始时刻的小时数追平
结束时刻;最后让分钟追平。以此计算出最终话费。
1017. Queueing at Bank (25)
题意
银行有 K 个窗口,所有到达银行的人都应该在黄线外等待,直到有窗口空余。
每个窗口对单个客人最多服务时间为 1 小时。N 个用户的到达时间和需要处理的时间给出。
8:00 到 17:00 接受服务,逾期不服务,也不计入统计数据。要求格式化输出用户的平均等待时间。
分析
又一道排队模拟题。相比 PAT1014,此题更复杂在于用户的到达时间是不确定的。
首先使用 qsort()按照到达时间对所有人排序。由于每个窗口同时只有一个人在处理,所以窗口之间没有差异,可以用 priority_queue 建立一个队列,
模拟所有 K 个窗口。
优先队列将结束时间最早的人放到队列的顶端,每次循环处理一个人的结束。然后步入一个黄线外等待的人。如果那个时刻,下一个人还没有达到,则可以将该人开始执行的时间记录为他的到达时间,并加入队列中。
还有一点需要注意的:HH:MM:SS 的时间格式,可以转换为累积秒数的时间,方便计算比较。
1018. Public Bike Management (30)
题意
以杭州的公用自行车站点管理为背景。每个站点是一个节点,每个节点上最多停放 Cmax 辆自行车,Cmax/2 为节点的最佳状态。不同节点间距离不同,整个构成了一张带权无向图。要求从起始点(公用自行车管理中心)出发,去目的地维护目的地节点的车辆状态,如果车辆低于 Cmax/2,则给它添加车辆到 Cmax/2 辆,如果多于 Cmax/2,则去除掉几辆车。同时,在去往目的地的过程中,也需要调整所有沿途站点的车辆(这里题目没有交代清楚,实际测试是只能在去往目的地的途中调整,回来的途上不可调整)。求到给定目的地的最短路径,如果有多条最短路径,则按照 1.从管理中心送出的车辆越少越好;2.拿回到管理中心的车越少越好的优先级找到结果。
分析
题目的大体框架是有权最短路径问题。步骤如下:
- 1.使用 Dijkstra 找到最短路径,其中注意记录每个节点在最短路径中的【所有】前驱节点;
- 2.使用 DFS 的方法,得到所有的最短路径。
- 3.计算每条最短路径的带出和带回的车辆数量。
其中 DFS 时,归纳所有答案的过程比较通用,需要掌握。
另外值得注意的是,类比到 PAT1003,该题采用了直接对每个节点增加状态记录的方式,直接得到最优解,而不是先找到最短路径,然后计算比较。本题是无法用这种方法实现的,需要送出和带回的自行车数量无法直接在 Dij 算法中每个节点的计算中体现,并不是前面的节点带回和送出的车辆越少,后面的节点就一定能得到更优解。
1019. General Palindromic Number (20)
题意
给定一个十进制数和一个进制,要求计算出在给定进制下的表达并判定是否为回文。
分析
简单的数字处理。
1020. Tree Traversals (25)
题意
根据二叉树的后序遍历和中序遍历,求层序遍历。
分析
具体实现方式:
- 初始:用后序遍历序列确定根节点,在中序遍历序列中找到该根节点,则左右子树分别为中序中该节点左右的序列。
- 迭代:对各个子树分别执行三步操作,1.在后序序列中找子树的根节点;2。在中序序列中找子树的根节点,并划分开根节点的左右子树;3.根据新生成的左右子树,在后序序列中划分开这些节点,从而得到了两颗子树的后序、中序序列。
有一个结论:中序遍历配合另外任何一个遍历,能重建二叉树。其他的任意两个序列的组合都不能唯一的确定重建的二叉树。具体分析参见博文《根据前中后序和层序重建二叉树(PAT1020、PAT1043)》。
原文地址:http://biaobiaoqi.github.com/blog/2013/07/31/pat-1011-1020-solutions/
版权声明:自由转载-非商用-非衍生-保持署名| Creative Commons BY-NC-ND 3.0
PAT 1011-1020 题解的更多相关文章
- PAT(B) 1020 月饼(Java)
题目链接:1020 月饼 (25 point(s)) 分析 将月饼(库存量,总售价,单价)封装成MoonCake类 Scanner会超时,用BufferedReader类读取数据 读取的时候用字符串数 ...
- 浙大pat 1011题解
With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...
- PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。
题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊,所以最后输出的是sum+0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么 ...
- 2019秋季PAT甲级_C++题解
2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...
- PAT乙级 1020. 月饼 (25)(只得到23分)
1020. 月饼 (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 月饼是中国人在中秋佳节时吃的一种传统食 ...
- PAT 1011
1011. World Cup Betting (20) With the 2010 FIFA World Cup running, football fans the world over were ...
- PAT Basic 1020
1020 月饼 (25 分) 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意 ...
- PAT 1011 World Cup Betting
1011 World Cup Betting (20 分) With the 2010 FIFA World Cup running, football fans the world over w ...
- PAT 乙级 1020 月饼 (25) C++版
1020. 月饼 (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 月饼是中国人在中秋佳节时吃的一种传统食 ...
- PAT 1011 A+B和C (15)(C++&JAVA&Python)
1011 A+B和C (15)(15 分) 给定区间[-2^31^, 2^31^]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1行给出正整数T(<=10),是测试用例的个 ...
随机推荐
- Redis实现Mybatis的二级缓存
一.Mybatis的缓存 通大多数ORM层框架一样,Mybatis自然也提供了对一级缓存和二级缓存的支持.一下是一级缓存和二级缓存的作用于和定义. 1.一级缓存是SqlSession级别的缓存.在操作 ...
- HDU 5372 线段树
给出两种操作: 第i个0:在x位置插入一个长度为i的线段,并输出该线段共覆盖了多少之前增加的线段 1:删除第i次插入的线段 官方题解:对于新插入的线段,查询有多少个线段左端点大于等于该线段的左端点. ...
- 2、JNI说明
JNI (Java Native Interface) 1. JAVA调用CLinux是用C语言写的,可以写一个APP简单调用open,read,write来访问驱动程序;Android是用Java写 ...
- 【心情】Priority_queue容器的用法
所给的代码最顶端是最小的元素 要改为最顶端是最大的则只需把 friend bool operator<(Node a, Node b) { return a.val > b.val; } ...
- IAdjustCountOption--动态设置recycleView的itemCount(不须要改动数据源)
概述 RecycleViewUtil是新增的一个主要针对RecycleView的一个工具类.该工具类中提供了部分RecycleView可能会使用到的方法,当中也包含了一些用来增强HeaderRecyc ...
- 8大排序算法图文讲解 分类: B10_计算机基础 2014-08-18 15:36 243人阅读 评论(0) 收藏
排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序. ...
- Android JAVA中的时间大小比较
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...
- gcc编译选项--转
gcc提供了大量的警告选项,对代码中可能存在的问题提出警告,通常可以使用-Wall来开启以下警告: -Waddress -Warray-bounds (only with -O2) ...
- MIPS Instruction Set
https://www.mips.com/develop/training-courses/mips-basic-training-course/ The MIPS64 Instruction Set ...
- 小强的HTML5移动开发之路(48)——(小练习)新闻订阅系统【1】
一.总体设计 二.数据库设计 --新闻类别表 create table news_cate( news_cateid int primary key auto_increment, news_icon ...