PAT
LostStephon
这个作者很懒,什么都没留下…
展开
-
pat1044Shopping in Mars (25)
题意分析:(1)给出一个整数序列,截取这个序列中的一段连续的子序列使得这个子序列的和等于给定的值,若不存在这样的序列,则找出序列的和大于给定值并且差值最小的。如有多个这样的序列,按照左边界的升序输出这些边界(2)一种简单的方法是从第一个位置开始,依次计算从第1、2..开始的连续和到等于M或者第一次大于M,在从第二个位置开始依次类推,这样时间复杂度就是o(n^2),很遗憾,这样的方案会导致有原创 2015-10-13 16:33:58 · 583 阅读 · 0 评论 -
pat1045Favorite Color Stripe (30)
题意分析:(1)给出一个有若干个数的偏好序列,同时给出另一个任意的数组,并且参照前面序列中元素出现的相对顺序(某些元素可以丢弃)依次从前往后选择数组中的元素组成一个新的数组,求这个数组的最大长度。(2)由于求解的是从数组A中下标范围到i这个序列的顺序,选择数组B中下标范围到j的最长数组的长度,可以分解为:A中下标范围到i,B中下标范围到j-1与A中下标范围到i-1,B中下标范围到j这两个子原创 2015-10-13 21:07:03 · 684 阅读 · 0 评论 -
pat1015Reversible Primes (20)
题意分析:(1)给定任意一个进制系统下的整数,判断这个数以及它的各位反过来的数在这个进制系统下是否都是素数。可能坑点:关于素数的判定有几点需要注意:(1)在寻找约数的时候,遍历的边界要设置到这个数的开方并取整后的整数(证明:一个数的约数总是在这个数的开方数的左右两侧成对出现,如果左边包括开方数不存在约数,右边一定不存在)(2)由于浮点数的运算可能存在误差,因此在开方运算后为了保原创 2015-10-02 21:30:30 · 644 阅读 · 0 评论 -
pat1010Radix (25)
题意分析:(1)给出两个正整数,给出其中一个正整数的基底,求另外一个正整数的基底,使得这两个正整数在各自的基底的十进制数相等(2)先求出给出基底的那个正整数在十进制下的值,求另外一个数的基底,很容易想到的是依次遍历基底,但遍历的边界在哪里?如何确定边界是要首先解决的问题:下界比较容易,题意说明给出正整数的每一位数字都要小于其基底,因此遍历的基底的下界就是各数位最大数字+1,那么遍历的上界如原创 2015-10-02 17:34:50 · 1167 阅读 · 2 评论 -
pat1046Shortest Distance (20)
题意分析:(1)给出一个环形公路中几个相邻出口之间的距离,然后任意给出若干对出口,求出这些出口之间最短的距离,(即从一个出口沿着两个方向到达另外一个出口的最短距离)(2)建议大家画一个示意图,分别求出沿着两个方向遍历到达另外一个出口的距离,然后比较这两个距离(3)这题坑在第三个案例上面,即使是时间复杂度为O(n)的如此简单算法,PAT的出题人也要在此设坑,简单的遍历都会超时,看来我们不原创 2015-10-14 22:03:19 · 600 阅读 · 0 评论 -
pat1040Longest Symmetric String (25)
题意分析:(1)给出一串字符串,求出其中最长的回文字串的长度(2)比较简单的做法是从第一个字符开始,依次同时向两边扩散检索,直至扫描整个字符串串结束。但需要注意子字符串长度为奇数和偶数时他们的扫描是不同的。(3)有一种比较难以想到动态规划做法是:将整个串str看作要求解的问题,他可以分解为str[0]~str[N-2]、str[1]~str[N-1]、str[1]~str[N-1]这三原创 2015-10-12 19:12:42 · 457 阅读 · 0 评论 -
pat1029Median (25)
题意分析:(1)给出两个有序序列,求这两个有序序列的中位数。(2)由于合并两个有序序列,再排序取中位数,复杂度为O(nlogn),会有几个案例超时,考虑到中位数的特殊性质,中位数一定是一个有序序列的中间位置的那个数,如果我们呢合并两个序列,那样之前给的两个有序序列这个条件我们就没用上。我们可以通过两个指针从队首依次顺序比较这两个序列的值并计数,数到第(M+N)/2的那个元素就是中位数了原创 2015-10-04 21:32:44 · 494 阅读 · 0 评论 -
pat1025PAT Ranking (25)
题意分析:(1)给出多个考点的考试人数以及考生考号和成绩,求出所有参加考试的人最终排名、考场编号、本考场排名(2)水题,考察排序,排名的规则按照以前的做法:按分数由高到低,同分同名次,不同分,按其在序列中的位置算排名可能坑点:#include #include using namespace std;struct testee{ string ID; in原创 2015-10-04 19:50:57 · 446 阅读 · 2 评论 -
pat1011World Cup Betting (20)
题意分析:(1)水题,采取边输入betting information边记录当前的best bet以及最高赔率可能坑点:(1)注意保留两位小数。#include #include #include using namespace std;int main(){ double odds[3]; int i=0; double product=1,m原创 2015-10-02 19:29:51 · 380 阅读 · 0 评论 -
pat1006Sign In and Sign Out (25)
题意分析:(1)给出N个人的出入记录,每条记录包含ID、进入时间、出去时间,找出最早进入房间、最晚走出房间的人的ID(2)用自定义结构体描述一个人的ID、进出时间;在输入记录的时候,边输入边维护两个string(first、last)变量和两个int(max、min)变量,将当前的对应的最早时间的人的ID赋值给first,最晚时间的ID赋值给last;可能坑点:(1)max初始化为原创 2015-10-02 16:28:13 · 521 阅读 · 0 评论 -
pat1036Boys vs Girls (25)
题意分析:(1)水题,没有什么好分析的。不需要开数组,只需要维护两个结构体,一个是最高分女生、一个最低分男生,然后边输入边更新这两个结构体。可能坑点:(2)因为分数的范围是[0,100],初始的最高分女生分数要设置为-1,不能为0,以免出现女生全是0的话,则不能更新,男生要设置为101,同理。#include #include using namespace std;str原创 2015-10-10 21:41:24 · 424 阅读 · 0 评论 -
pat1032Sharing (25)
题意分析:(1)找出两个单词公共后缀的起始地址,单词以字符链表的形式存储起来,因为地址是5位整数,并且地址上的前驱后继关系唯一,因此开辟一个数组,其下标用来表示地址。因为题目给出的字母顺序是乱的,最好先用map存储链接关系。这样遍历效率会更高。遍历地址,并置数组相应的位置为1,当便利第二个单词的时候,当访问到此地址已经标记为1,则为公共后缀的开始位置。可能坑点:#include #i原创 2015-10-04 23:00:06 · 589 阅读 · 0 评论 -
pat1030Travel Plan (30)
题意分析:(1)给出城市的的地图分布以及道路距离和每条道路的开销,给出出发点到目的地,找出最短路径,若有多条这样的路径,选择开销最小的(2)这种题目已经不是什么难题了,之前的有很多这样的题目,参考1003(Emergency)、1018(Public Bike Management),都是深度优先,然后回溯,更新当前最短路径,而且由于开销并不是全局的,所以当最短路径更新的时候,开销要强制更原创 2015-10-04 21:54:03 · 432 阅读 · 0 评论 -
pat1028List Sorting (25)
题意分析:(1)简单的排序题,按照不同的索引给学生的考试信息进行排序可能坑点:#include #include #include #include using namespace std;struct student{ char ID[7]; char name[9]; int score;};student stu[100001];bo原创 2015-10-04 21:21:16 · 447 阅读 · 0 评论 -
pat1001A+B Format (20)
题意分析:(1)输入两个普通整数a,b([-1000000,1000000]),把它们的和按照三位一个逗号来分割输出。(2)因为最终是对结果的整数进行分割加入字符,直接采用取模运算的话,需要开辟一个数组空间来按顺序存取模后的值,最后逆序处理,或者按照递归的思路,如整除1000后不为0,再以num/1000为参数进入下一层递归,直至为0的时候退出递归栈,但是这样会带来一个问题:每次取模后的数原创 2015-10-02 11:46:06 · 501 阅读 · 0 评论 -
pat1042Shuffling Machine (20)
题意分析:(1)给出54张扑克牌的原始顺序,给出任意1~54的排列,此排列意味着对本次扑克牌位置的调整,数组中的序号为a的值b,意味着将原来在a位置的扑克牌移动到第b号位置,求按此排列洗牌K次后的顺序。(2)因为每次所给的调整顺序一样,对于原始序列中的第i个牌,我们暂且就将他记为i,追踪它在K次调整后“花落谁家”,假设为j,然后用另外一个数组newOrder在第j个位置存i.这样每一张扑克原创 2015-10-12 22:39:04 · 675 阅读 · 0 评论 -
pat1039Course List for Student (25)
题意分析:(1)给出每个课程的编号以及选课的人数和选课的学生的姓名,给出若干个同学的姓名,要求按照给出的顺序列出每个学生选定的课程数、课程编号(按照从小到大的顺序)(2)题目意思很简单,在做的过程中,可能会有多种方案,相信大家大部分人前面几个案例都可以过,就是最后一个案例要么超时,要么内存超限。因为涉及到根据字符串来索引列表,并且对索引到的结果排序。根据此思路就会出现三种做法,每一次都会从原创 2015-10-12 15:16:08 · 423 阅读 · 0 评论 -
pat1038Recover the Smallest Number (30)
题意分析:(1)给出若干个整数片段,问按怎样的顺序组合这些片段,使得这些片段组合起来后的数最小,求出这个最小的数(2)要确定这些片段的顺序,首先要明确的就是对于任意两个片段来说,确定其相对位置来说是很简单的,两个片段a、b,最直接的方法就是判断他们按两种方式连接后ab和ba的大小,如果这些片段都是字符串,那么ab和ba都是相同位数的,直接利用C++字符串比较即可(3)按照(2)的排序规原创 2015-10-12 10:09:23 · 587 阅读 · 0 评论 -
pat1033To Fill or Not to Fill (25)
题意分析:(1)给出从出发地到目的地之间的若干个加油站的信息(每升价格 距出发点距离)以及油箱容量、目的地、每升油公里、油站数,出发时油箱为空,问要到达目的地的最少开销,如不能到达目的地,求出最多能够走多远。这题分明显是一道贪心算法题,贪心算法题最主要的是理清贪心的策略:算法前准备:①将站点信息包装成结构体②输入的站点时候过滤掉在目的地之外的站点(距离超过目的地),这些站点毫无原创 2015-10-07 21:04:14 · 603 阅读 · 0 评论 -
pat1031Hello World for U (20)
题意分析:(1)给出一个长度大于5的字符串,然后从上到下输出n1个字符,从左到右到右输出n2个字符(包括边界,也就是n1的最后一个字符),从下到上输出n3个字符,让结果尽可能呈现方形,按照题目中公式的理解:n1=n3(2)按照打印规则,在求出n1,n2,n3之后,先输出字符串第一个字符,中间应该空出n2-2个字符(因为n2也包括了n1和n3最底下的两个字符),再输出最后一个字符,依此类推。原创 2015-10-04 22:50:25 · 438 阅读 · 0 评论 -
pat1024Palindromic Number (25)
题意分析:(1)给定一个正整数N,如不是回文数,执行N+N各位数字颠倒后组成的数,求在第几步之后得到的结果是回文数。(2)由于涉及到调换数的位置的操作,并且当我们看到N可能坑点:(1)即使是用long long类型也未必保险,因为K是在100以内的。#include #include using namespace std;bool isPalindromic(stri原创 2015-10-04 17:35:45 · 421 阅读 · 0 评论 -
pat1019General Palindromic Number (20)
题意分析:(1)水题,给出一个整数和一个基底,把这个整数转化成此基底下的对应的数,判断转换后的数是不是回文数;可能坑点:#include #include #include using namespace std;int main(){ long long N,b; cin>>N>>b; int num[100000]; int i=0;原创 2015-10-03 17:49:41 · 451 阅读 · 0 评论 -
pat1018Public Bike Management (30)
题意分析:(1)给出城市自行车租赁点分布以及路线,找到从PBMC出发到达需要调整目标点的最短路径,同时保证在调整这条路径上所有站点的自行车数时,出发时携带的自行车最少,如过不止一条,需要找出返回时携带最少自行车的最佳路线(2)PAT中这种类型的题目比较常见,经常是从出发点到目标点求出最短路径,无非是在最佳路径上做出一些新花样,保证什么量最少,什么量最多,可以参考1003,也是同类型的题目,原创 2015-10-03 17:13:18 · 764 阅读 · 0 评论 -
pat1009Product of Polynomials (25)
题意分析:(1)给出两个多项式:项数 指数 系数...,求这两个多项式的乘积并按照原来格式输出(2)与1002相反,先应将多项式1用数组存起来(使用结构体数组连续存储),当输入多项式2的项时,分别将其与多项式1的每一项乘积的结果存入另外一个数组(浮点数数组,针对元素不多的情况),指数的和为对应的下标,同时更新数组元素的值(加上系数乘积)。最后逆序打印,避免排序可能坑点:(1)在计算原创 2015-10-02 17:06:54 · 778 阅读 · 0 评论 -
pat1005Spell It Right (20)
题意分析:(1)水题,给出一个位数很长很长的数,计算各位数字之和,把结果用英文按位打印(2)求出的和的各位数字通过取模后存入数组,再逆序用英文打印,也可以采用递归方式打印(注:虽然递归从效率和空间方面来说不高,但是对于这些数据量不大题来说,理解起来说比较方便,以后遇到这种打印的问题,本人习惯使用递归)可能坑点:(1)是很长很长。。。,不要试图去申明什么longlong的,乖乖地去开原创 2015-10-02 14:51:25 · 495 阅读 · 0 评论 -
pat1004Counting Leaves (30)
题意分析:(1)给出树中节点的总数以及非叶子节点的总数,并给出各非叶子节点的编号、其孩子节点的个数、其孩子节点的编号,求出每一层叶子节点的个数(2)题意是求出每一层的叶子结点数,其次给出的节点的父子关系很明确,应使用层序遍历的方式(3)层序遍历过程中存储节点的队列中在front和rear指针之间需要借助一个tag指针,用来标记从front指针到rear指针之间的节点处于同一层,然后开始原创 2015-10-02 14:32:01 · 1555 阅读 · 0 评论 -
pat1002A+B for Polynomials (25)
题意分析:(1)输入两个多项式,每个多项式按照:项数 指数 系数 ...格式输入,按照此格式输出两个多项式的和(2)项数和指数均为正整数,系数为小数,很自然联想到开辟一个浮点数的数组,下标用来表示指数,数组元素用来表示系数,用浮点数组来表示多项式,节省了额外空间(3)当输入完第一个多项式后,第二个多项式的输入和加法操作依然可以在之前的浮点数组之上操作,进一步节省空间和时间可能坑点:原创 2015-10-02 12:09:40 · 500 阅读 · 0 评论 -
pat1022Digital Library (30)
题意分析:(1)给出若干条书籍信息:按照书名、作者、关键字、出版商、出版年份的格式列出;再给出若干条检索记录,这些检索记录是围绕书名、作者、关键字、出版社以及年份,来按顺序列出查询的书的ID,考察的是排序和查找。(2)将书的信息包装成结构体,在这些结构体当中,比较容易检索的包括书名、作者、出版社、出版年份;而对于关键字来说,由于每本书最多会有5个关键字,书的数目比较大时,如果将关键字向量或原创 2015-10-04 16:46:52 · 1744 阅读 · 1 评论 -
pat1013Battle Over Cities (25)
题意分析:(1)根据城市以及相互之间的道路分布地图,求出当其中一个城市被占领后(切断所有与其他城市连接的道路),让这个图中剩下的连通分量连接起来所需修的最少的道路数。(2)求连通分量宜采用深度优先遍历可能坑点:(1)在计算道路被切断的时候,图中有多少个连通分量(极大联通子图)的个数时,不要忘记被占领的城市也是一个连通分量,这个连通分量要去掉。因此最后的结果是连通分量数-1-1#原创 2015-10-02 20:27:11 · 461 阅读 · 0 评论 -
pat1016Phone Bills (25)
题意分析:(1)给出一天24个小时各时间段之内长途电话的价格(cents/minutes),再给出若干条通话记录,通话记录由:name 时间 上线/下线,根据通话记录按照要求列出每个人在某个月的通话时间段,时长,通话费用,以及本月通话费用(2)将每个通话记录包装成一个结构体,然后对结构体数组(Vector)进行按姓名的字典序、时间排序(3)过滤掉没有匹配项的通话记录,转存到Vector原创 2015-10-03 11:34:27 · 385 阅读 · 0 评论 -
pat1014Waiting in Line (30)
题意分析:(1)本题模拟银行排队,逻辑上不难,操作起来有点麻烦。银行来了K个客户,银行有N个窗口,每个窗口前有M个位置排队,客户选择最短的队伍排,根据每个客户的序号和服务时间来确定最后客户离开银行的时间。(2)属于队列的问题,但实际上可以将问题简化:因为每个客户的服务时间是固定的,假设前N*M个客户达到之后排好位置后,他们的离开时间也就确定好了,即每个窗口本次服务结束的时间也就确定了,比如原创 2015-10-02 20:33:17 · 755 阅读 · 0 评论 -
pat1012The Best Rank (25)
题意分析:(1)给出每位同学ID、以及C、M、E、A等各项成绩,求出每位同学在某方面最好的名次,有多项最好名次的科目按照优先级A>C>M>E的顺序来确定(2)很明显判断一个同学的最好名次要根据其各项成绩,将其ID和各项成绩包装成为一个结构体,以后对所有学生各项成绩的排名就直接对结构体数组排序,另外,包装成结构体之后,可以按照题目所给的顺序来动态更新当前最好名次和科目,所以一个学生的结构体包原创 2015-10-02 19:45:07 · 1243 阅读 · 0 评论 -
pat1008Elevator (20)
题意分析:(1)水题,没什么好分析的坑点:(1)第一个数差点看错为为电梯到达的第一个楼层,有没有被坑。。。#include using namespace std;int main(){ int N,i=0; cin>>N; int preFloor=0,currFloor,total=0; while(i<N) {原创 2015-10-02 17:00:06 · 430 阅读 · 0 评论 -
pat1003Emergency (25)
题意分析:(1)给出城市的道路分布、各道路的长度、以及各城市拥有的救援队伍,找出从出发点到事发点最短路径数以及沿途能够集结到最多的救援队伍数。(2)按照题意理解,此题属于求最短路径的题目,可以采用深度优先搜索,但需要注意回溯,动态更新最短路径以及能够集结的最多救援队伍数;当然也可以先求出最短路径之后再求最多队伍数,本题采用边搜索边更新。(3)采用数组来记录最短路径,数组中元素记录的是第原创 2015-10-02 13:12:01 · 932 阅读 · 0 评论 -
pat1053Path of Equal Weight (30)
题意分析:(1)给出一颗树的父子表示关系,给出每一个节点自身编号和节点权值,然后给出每一个非叶子结点及其子节点的邻接关系,然后找出一条路径使得路径上节点的权值之和等于给定的值,若有多条路径,则按照序列的大小关系输出,序列的大小关系指的是:序列a>序列b,则从序列a和序列b的第一个元素开始,第一次出现在同等位置上的a的元素大于b的元素(2)使用DFS从根节点开始遍历,然后记录下当前的非叶子节原创 2015-10-22 22:36:07 · 749 阅读 · 0 评论 -
pat1054The Dominant Color (20)
题意分析:(1)给出M*N的像素矩阵,矩阵的每个元素代表24比特的RGB值,找出这个矩阵中总个数超过一半的像素值(一定存在)(2)找出一组数中个数超过一半的数,以下有两种常见思路:①有一种思路是统计每个数出现的次数:先开辟大小为2^24+1的计数数组count,初始化为0,然后依据数组下标作为元素值统计数组中每个元素出现的次数。然后再寻找出现次数最多的那个数。这样做还没等统计完。第二个原创 2015-10-23 14:22:35 · 436 阅读 · 0 评论 -
pat1056Mice and Rice (25)
题意分析:(1)给出一组数代表每个人的初始程序的“得分”,然后按照给出的一个任意排列的顺序,在这个排列中按照顺序每NG个人一组进行PK,每一组中最大的那个人PK胜出进入下一轮,剩余的人本轮淘汰,并且排名相同。不足NG人的小组按照一个小组计算(2)相信绝大多数人都没有弄清楚这题到底是怎么得出最终的计算排名,原因在以下几个方面:①那个排列就是出场的顺序,也就是每个人按自己的序号出场的顺序(原创 2015-10-23 16:43:29 · 1156 阅读 · 0 评论 -
pat1055The World's Richest (25)
题意分析:(1)给出若干个富人的姓名 年龄 财富值,以及若干个查询条件:前M名年龄在[a,b]之间的富人,并按照财富值递减 年龄递增 姓名递减的优先级顺序输出这些富人信息(2)水题,简单的排序题,对富人信息包装成结构体,然后排序可能坑点:(1)注意使用cin和cout会超时(2)注意字符串的使用,scanf不支持字符串,但使用C++字符串比较会很简单#include #i原创 2015-10-23 15:27:55 · 487 阅读 · 0 评论 -
pat1052Linked List Sorting (25)
题意分析:(1)给出内存中链表的节点,节点定义为:address value nextaddress并且给出链表的起始地址,按照原来的格式输出这个链表经过按照value排序后的链表,即:链表节点的个数 起始地址以及每个链表的节点(2)因为涉及到链表节点的排序,先将链表的定义包装成结构体,然后按照value值进行排序,因为排序后address域没有发生变化,而nextAddress域变成了排原创 2015-10-21 16:30:50 · 503 阅读 · 0 评论 -
pat1051Pop Sequence (25)
题意分析:(1)给出若干个从1到N的排列,并且给出栈的深度,问这些排列是否是从1到N的出栈序列(2)判断一个序列是否是一个出栈序列受栈的深度、出入栈的顺序的制约:若入栈个数大于栈的最大深度,则此种入栈方式不合法,对应的序列不是出栈序列;另外由于是按序入栈,如出栈的元素在栈顶的下方,此时出栈的方式不合法,对应的序列不是出站序列。我们可以根据第一个出栈的元素去反推出入栈顺序,再通过比较下一原创 2015-10-21 15:06:34 · 458 阅读 · 0 评论