
C++
LostStephon
这个作者很懒,什么都没留下…
展开
-
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 · 722 阅读 · 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 · 499 阅读 · 0 评论 -
pat1029Median (25)
题意分析:(1)给出两个有序序列,求这两个有序序列的中位数。(2)由于合并两个有序序列,再排序取中位数,复杂度为O(nlogn),会有几个案例超时,考虑到中位数的特殊性质,中位数一定是一个有序序列的中间位置的那个数,如果我们呢合并两个序列,那样之前给的两个有序序列这个条件我们就没用上。我们可以通过两个指针从队首依次顺序比较这两个序列的值并计数,数到第(M+N)/2的那个元素就是中位数了原创 2015-10-04 21:32:44 · 527 阅读 · 0 评论 -
pat1017Queueing at Bank (25)
题意分析:(1)给出N个人的到达银行的时间和需要被服务的时间,在K个窗口的情况下,求出所有人的平均等待时间,对于5点以后到达的人不计算在内。(2)看似是排队的问题,需要先固定每个人在哪个窗口队列的哪个位置以及他前面的人的服务时间,同时也依赖于他的到达时间和当前第一个人被服务了多长时间,这样看来问题变得复杂了许多,我们将问题简化成这样:每个窗口只维护自己的空闲时刻(8:00开始),谁最先空闲原创 2015-10-03 15:54:47 · 1159 阅读 · 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 · 470 阅读 · 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 · 496 阅读 · 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 · 466 阅读 · 0 评论 -
pat1044Shopping in Mars (25)
题意分析:(1)给出一个整数序列,截取这个序列中的一段连续的子序列使得这个子序列的和等于给定的值,若不存在这样的序列,则找出序列的和大于给定值并且差值最小的。如有多个这样的序列,按照左边界的升序输出这些边界(2)一种简单的方法是从第一个位置开始,依次计算从第1、2..开始的连续和到等于M或者第一次大于M,在从第二个位置开始依次类推,这样时间复杂度就是o(n^2),很遗憾,这样的方案会导致有原创 2015-10-13 16:33:58 · 651 阅读 · 0 评论 -
pat1003Emergency (25)
题意分析:(1)给出城市的道路分布、各道路的长度、以及各城市拥有的救援队伍,找出从出发点到事发点最短路径数以及沿途能够集结到最多的救援队伍数。(2)按照题意理解,此题属于求最短路径的题目,可以采用深度优先搜索,但需要注意回溯,动态更新最短路径以及能够集结的最多救援队伍数;当然也可以先求出最短路径之后再求最多队伍数,本题采用边搜索边更新。(3)采用数组来记录最短路径,数组中元素记录的是第原创 2015-10-02 13:12:01 · 972 阅读 · 0 评论 -
pat1046Shortest Distance (20)
题意分析:(1)给出一个环形公路中几个相邻出口之间的距离,然后任意给出若干对出口,求出这些出口之间最短的距离,(即从一个出口沿着两个方向到达另外一个出口的最短距离)(2)建议大家画一个示意图,分别求出沿着两个方向遍历到达另外一个出口的距离,然后比较这两个距离(3)这题坑在第三个案例上面,即使是时间复杂度为O(n)的如此简单算法,PAT的出题人也要在此设坑,简单的遍历都会超时,看来我们不原创 2015-10-14 22:03:19 · 644 阅读 · 0 评论 -
pat1043Is It a Binary Search Tree (25)
题意分析:(1)给出一数列,判断这个数列是否是一个二叉查找树的先序遍历序列或镜像二叉查找树的先序遍历序列,所谓镜像二叉查找树就是二叉查找树所有节点的左右子树交换后的二叉树(2)二叉查找树有一个特性就是根节点左边所有子树节点的值小于根节点的值,右子树所有节点的值大于或等于根节点的值,同时左右子树也是一颗二叉查找树(3)由(2)的递归的性质:于是判断这个序列是否是BST或者镜像BST先序遍原创 2015-10-13 16:15:42 · 532 阅读 · 0 评论 -
pat1038Recover the Smallest Number (30)
题意分析:(1)给出若干个整数片段,问按怎样的顺序组合这些片段,使得这些片段组合起来后的数最小,求出这个最小的数(2)要确定这些片段的顺序,首先要明确的就是对于任意两个片段来说,确定其相对位置来说是很简单的,两个片段a、b,最直接的方法就是判断他们按两种方式连接后ab和ba的大小,如果这些片段都是字符串,那么ab和ba都是相同位数的,直接利用C++字符串比较即可(3)按照(2)的排序规原创 2015-10-12 10:09:23 · 626 阅读 · 0 评论 -
pat1026Table Tennis (30)
题意分析:(1)给出N个人到达乒乓球场的时间以及他们需要打多长时间的球,这些人分为两类:一类是VIP客户,一类是非VIP客户,所有的客户按到来的时间排好队伍等候,一旦出现空的乒乓球台,客户将立即选择编号最小的乒乓球台,每个客户最多不能超过两个小时,求每个客户的等待时间,以及每个乒乓球台一天服务了多少人。(2)VIP客户与普通客户不同点在于:一旦有VIP桌子空闲,处于等待队列中的最早到达的V原创 2015-10-04 20:20:29 · 2152 阅读 · 4 评论 -
pat1001A+B Format (20)
题意分析:(1)输入两个普通整数a,b([-1000000,1000000]),把它们的和按照三位一个逗号来分割输出。(2)因为最终是对结果的整数进行分割加入字符,直接采用取模运算的话,需要开辟一个数组空间来按顺序存取模后的值,最后逆序处理,或者按照递归的思路,如整除1000后不为0,再以num/1000为参数进入下一层递归,直至为0的时候退出递归栈,但是这样会带来一个问题:每次取模后的数原创 2015-10-02 11:46:06 · 532 阅读 · 0 评论 -
pat1002A+B for Polynomials (25)
题意分析:(1)输入两个多项式,每个多项式按照:项数 指数 系数 ...格式输入,按照此格式输出两个多项式的和(2)项数和指数均为正整数,系数为小数,很自然联想到开辟一个浮点数的数组,下标用来表示指数,数组元素用来表示系数,用浮点数组来表示多项式,节省了额外空间(3)当输入完第一个多项式后,第二个多项式的输入和加法操作依然可以在之前的浮点数组之上操作,进一步节省空间和时间可能坑点:原创 2015-10-02 12:09:40 · 530 阅读 · 0 评论 -
pat1041Be Unique (20)
题意分析:(1)给出一组数,找出这组数中第一个在此数列中只出现一次的数(2)水题,开辟一个数组作为位图索引使用,每出现某个数一次,就在索引位置+1,同时使用vector记录下原来的数组顺序,以便后面遍历使用,当第一次遍历到某个数时,其索引数组对应的位置值为1,则输出可能坑点:(1)不要对数组中每个元素采用循环遍历的方法,否则超时#include #include #incl原创 2015-10-12 21:14:39 · 550 阅读 · 0 评论 -
pat1039Course List for Student (25)
题意分析:(1)给出每个课程的编号以及选课的人数和选课的学生的姓名,给出若干个同学的姓名,要求按照给出的顺序列出每个学生选定的课程数、课程编号(按照从小到大的顺序)(2)题目意思很简单,在做的过程中,可能会有多种方案,相信大家大部分人前面几个案例都可以过,就是最后一个案例要么超时,要么内存超限。因为涉及到根据字符串来索引列表,并且对索引到的结果排序。根据此思路就会出现三种做法,每一次都会从原创 2015-10-12 15:16:08 · 455 阅读 · 0 评论 -
pat1034Head of a Gang (30)
题意分析:(1)给出若干条通话记录(包括通话的两端的ID、时长),通过通话记录找出其中有多少个团伙,以及每个团伙的首领和团伙人数,所谓团伙就是指通过话的“联通”组织超过三人,可以理解为连通分量的人数超过三人,且集体通话时长超过一个给定的阈值。团伙首领是指在这个团伙中,这个人的通话时长最长(2)此题的目标是寻找满足权值超过阈值、节点数超过2的联通分量,最简单的方法就是通过深度优先搜索遍历整个原创 2015-10-10 18:30:08 · 1451 阅读 · 1 评论 -
pat1033To Fill or Not to Fill (25)
题意分析:(1)给出从出发地到目的地之间的若干个加油站的信息(每升价格 距出发点距离)以及油箱容量、目的地、每升油公里、油站数,出发时油箱为空,问要到达目的地的最少开销,如不能到达目的地,求出最多能够走多远。这题分明显是一道贪心算法题,贪心算法题最主要的是理清贪心的策略:算法前准备:①将站点信息包装成结构体②输入的站点时候过滤掉在目的地之外的站点(距离超过目的地),这些站点毫无原创 2015-10-07 21:04:14 · 640 阅读 · 0 评论 -
pat1032Sharing (25)
题意分析:(1)找出两个单词公共后缀的起始地址,单词以字符链表的形式存储起来,因为地址是5位整数,并且地址上的前驱后继关系唯一,因此开辟一个数组,其下标用来表示地址。因为题目给出的字母顺序是乱的,最好先用map存储链接关系。这样遍历效率会更高。遍历地址,并置数组相应的位置为1,当便利第二个单词的时候,当访问到此地址已经标记为1,则为公共后缀的开始位置。可能坑点:#include #i原创 2015-10-04 23:00:06 · 627 阅读 · 0 评论 -
pat1027Colors in Mars (20)
题意分析:(1)水题:给出三个(0~168)十进制数,转换成13进制的数(0~9,A=10,B=11,C=12)按格式输出(2)进制转换使用除留余数法,对于余数大于9的需要变化成对应字符可能坑点:(1)当转换后只有一位的时候,需要补全前导0#include #include using namespace std;void transToMars(int num){原创 2015-10-04 21:16:06 · 461 阅读 · 0 评论 -
pat1025PAT Ranking (25)
题意分析:(1)给出多个考点的考试人数以及考生考号和成绩,求出所有参加考试的人最终排名、考场编号、本考场排名(2)水题,考察排序,排名的规则按照以前的做法:按分数由高到低,同分同名次,不同分,按其在序列中的位置算排名可能坑点:#include #include using namespace std;struct testee{ string ID; in原创 2015-10-04 19:50:57 · 482 阅读 · 2 评论 -
pat1023Have Fun with Numbers (20)
题意分析:(1)水题,给出一个长度在20以内的正整数,问翻倍之后结果是否是原来的数的各位数字组成的一个新排列(2)使用数组num[10]来统计每个数字出现的频数,输入数字时,在对应的下标位置开始计数,遍历结果时,执行对应下标位置自减,最后遍历数组,有不为0的则不是可能坑点:(1)20位以内的整数可能已经超出long long类型的范围,还是采用字符串或者是字符数组来处理#inc原创 2015-10-04 17:23:19 · 511 阅读 · 0 评论 -
pat1020Tree Traversals (25)
题意分析:(1)这是很数据结构中很经典的一类题型,给出中序序列和先序或者后序序列中的一种,求另外另类序列。一般若是求层序,需要构建二叉树,如果不是,可以不用建树;(2)建树的过程是一个递归的过程,最后按层次遍历打印可能坑点:(1)建树的时候大多数人可能坑在不知道应该如何传根节点的指针。其实很简单,因为需要建树,调用建树操作一定是最后影响到这个指针的,所以一定要使用引用#incl原创 2015-10-03 18:11:53 · 505 阅读 · 0 评论 -
pat1015Reversible Primes (20)
题意分析:(1)给定任意一个进制系统下的整数,判断这个数以及它的各位反过来的数在这个进制系统下是否都是素数。可能坑点:关于素数的判定有几点需要注意:(1)在寻找约数的时候,遍历的边界要设置到这个数的开方并取整后的整数(证明:一个数的约数总是在这个数的开方数的左右两侧成对出现,如果左边包括开方数不存在约数,右边一定不存在)(2)由于浮点数的运算可能存在误差,因此在开方运算后为了保原创 2015-10-02 21:30:30 · 680 阅读 · 0 评论 -
pat1014Waiting in Line (30)
题意分析:(1)本题模拟银行排队,逻辑上不难,操作起来有点麻烦。银行来了K个客户,银行有N个窗口,每个窗口前有M个位置排队,客户选择最短的队伍排,根据每个客户的序号和服务时间来确定最后客户离开银行的时间。(2)属于队列的问题,但实际上可以将问题简化:因为每个客户的服务时间是固定的,假设前N*M个客户达到之后排好位置后,他们的离开时间也就确定好了,即每个窗口本次服务结束的时间也就确定了,比如原创 2015-10-02 20:33:17 · 798 阅读 · 0 评论 -
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 · 414 阅读 · 0 评论 -
pat1022Digital Library (30)
题意分析:(1)给出若干条书籍信息:按照书名、作者、关键字、出版商、出版年份的格式列出;再给出若干条检索记录,这些检索记录是围绕书名、作者、关键字、出版社以及年份,来按顺序列出查询的书的ID,考察的是排序和查找。(2)将书的信息包装成结构体,在这些结构体当中,比较容易检索的包括书名、作者、出版社、出版年份;而对于关键字来说,由于每本书最多会有5个关键字,书的数目比较大时,如果将关键字向量或原创 2015-10-04 16:46:52 · 1808 阅读 · 1 评论 -
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 · 494 阅读 · 0 评论 -
pat1010Radix (25)
题意分析:(1)给出两个正整数,给出其中一个正整数的基底,求另外一个正整数的基底,使得这两个正整数在各自的基底的十进制数相等(2)先求出给出基底的那个正整数在十进制下的值,求另外一个数的基底,很容易想到的是依次遍历基底,但遍历的边界在哪里?如何确定边界是要首先解决的问题:下界比较容易,题意说明给出正整数的每一位数字都要小于其基底,因此遍历的基底的下界就是各数位最大数字+1,那么遍历的上界如原创 2015-10-02 17:34:50 · 1203 阅读 · 2 评论 -
pat1009Product of Polynomials (25)
题意分析:(1)给出两个多项式:项数 指数 系数...,求这两个多项式的乘积并按照原来格式输出(2)与1002相反,先应将多项式1用数组存起来(使用结构体数组连续存储),当输入多项式2的项时,分别将其与多项式1的每一项乘积的结果存入另外一个数组(浮点数数组,针对元素不多的情况),指数的和为对应的下标,同时更新数组元素的值(加上系数乘积)。最后逆序打印,避免排序可能坑点:(1)在计算原创 2015-10-02 17:06:54 · 812 阅读 · 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 · 550 阅读 · 0 评论 -
pat1005Spell It Right (20)
题意分析:(1)水题,给出一个位数很长很长的数,计算各位数字之和,把结果用英文按位打印(2)求出的和的各位数字通过取模后存入数组,再逆序用英文打印,也可以采用递归方式打印(注:虽然递归从效率和空间方面来说不高,但是对于这些数据量不大题来说,理解起来说比较方便,以后遇到这种打印的问题,本人习惯使用递归)可能坑点:(1)是很长很长。。。,不要试图去申明什么longlong的,乖乖地去开原创 2015-10-02 14:51:25 · 530 阅读 · 0 评论 -
pat1004Counting Leaves (30)
题意分析:(1)给出树中节点的总数以及非叶子节点的总数,并给出各非叶子节点的编号、其孩子节点的个数、其孩子节点的编号,求出每一层叶子节点的个数(2)题意是求出每一层的叶子结点数,其次给出的节点的父子关系很明确,应使用层序遍历的方式(3)层序遍历过程中存储节点的队列中在front和rear指针之间需要借助一个tag指针,用来标记从front指针到rear指针之间的节点处于同一层,然后开始原创 2015-10-02 14:32:01 · 1616 阅读 · 0 评论 -
pat1053Path of Equal Weight (30)
题意分析:(1)给出一颗树的父子表示关系,给出每一个节点自身编号和节点权值,然后给出每一个非叶子结点及其子节点的邻接关系,然后找出一条路径使得路径上节点的权值之和等于给定的值,若有多条路径,则按照序列的大小关系输出,序列的大小关系指的是:序列a>序列b,则从序列a和序列b的第一个元素开始,第一次出现在同等位置上的a的元素大于b的元素(2)使用DFS从根节点开始遍历,然后记录下当前的非叶子节原创 2015-10-22 22:36:07 · 803 阅读 · 0 评论 -
pat1054The Dominant Color (20)
题意分析:(1)给出M*N的像素矩阵,矩阵的每个元素代表24比特的RGB值,找出这个矩阵中总个数超过一半的像素值(一定存在)(2)找出一组数中个数超过一半的数,以下有两种常见思路:①有一种思路是统计每个数出现的次数:先开辟大小为2^24+1的计数数组count,初始化为0,然后依据数组下标作为元素值统计数组中每个元素出现的次数。然后再寻找出现次数最多的那个数。这样做还没等统计完。第二个原创 2015-10-23 14:22:35 · 469 阅读 · 0 评论 -
pat1056Mice and Rice (25)
题意分析:(1)给出一组数代表每个人的初始程序的“得分”,然后按照给出的一个任意排列的顺序,在这个排列中按照顺序每NG个人一组进行PK,每一组中最大的那个人PK胜出进入下一轮,剩余的人本轮淘汰,并且排名相同。不足NG人的小组按照一个小组计算(2)相信绝大多数人都没有弄清楚这题到底是怎么得出最终的计算排名,原因在以下几个方面:①那个排列就是出场的顺序,也就是每个人按自己的序号出场的顺序(原创 2015-10-23 16:43:29 · 1210 阅读 · 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 · 526 阅读 · 0 评论 -
pat1052Linked List Sorting (25)
题意分析:(1)给出内存中链表的节点,节点定义为:address value nextaddress并且给出链表的起始地址,按照原来的格式输出这个链表经过按照value排序后的链表,即:链表节点的个数 起始地址以及每个链表的节点(2)因为涉及到链表节点的排序,先将链表的定义包装成结构体,然后按照value值进行排序,因为排序后address域没有发生变化,而nextAddress域变成了排原创 2015-10-21 16:30:50 · 539 阅读 · 0 评论 -
pat1051Pop Sequence (25)
题意分析:(1)给出若干个从1到N的排列,并且给出栈的深度,问这些排列是否是从1到N的出栈序列(2)判断一个序列是否是一个出栈序列受栈的深度、出入栈的顺序的制约:若入栈个数大于栈的最大深度,则此种入栈方式不合法,对应的序列不是出栈序列;另外由于是按序入栈,如出栈的元素在栈顶的下方,此时出栈的方式不合法,对应的序列不是出站序列。我们可以根据第一个出栈的元素去反推出入栈顺序,再通过比较下一原创 2015-10-21 15:06:34 · 492 阅读 · 0 评论