Skip to content

Cyprus-hy/PAT_Basic-level

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

97 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PAT_Basic-level

写在前面

我想每一个刷题的人都是孤独的
对于我来说
刷题就是一种痛苦的修炼(大神勿扰,QAQ)
那种AC的快感
亦或是WA的沮丧
但无论怎样,请加油ヾ(◍°∇°◍)ノ゙
我相信,你会做得比我更好

关于PAT乙级

乙级原题

几点想说的:

  1. 我将题目的难度大致分为了水题、简单题、中档题。如果是有过刷题经历的同学,可以直接跳过水题;如果是数据结构已经学得很好的同学,可以只做中档题或者直接刷甲级
  2. 乙级题目基本都没有涉及到比较难的算法与数据结构,但对编程基础的要求比较高,尤其要掌握一些STL容器(比如vector、map与set)的基本操作,同时也要对字符串的操作比较熟悉
  3. 很多题目都对边界情况有很强的要求,所以如果你某个测试点过不了,可以来看看我的题解,嘻嘻嘻
  4. 某些题目会有很大的数据量,所以你写的代码可能在vs上运行时会爆内存,但不必担心,PAT的测评机是可以跑得动的;当然,你也可以选择把这些开得很大的数组或vector啥的写成全局变量
  5. 对于很多具体细节的注意事项,我在每道题的题解中都基本有提到,这里就不详细说了

暂时想到这么多,如果以后想到了再随时补充吧~

题解报告

  • 1001 水题 简单模拟 偶数每次除2,奇数每次乘3加1再除2 注意每次处理完后重新判断是奇数还是偶数

  • 1002 水题 简单大数运算 先用字符串数组存储好每一位对应的拼音,对每一位求和后再拆开数字,对着拼音数组输出

  • 1003 中档题 这道题很扯,首先你得明白形如xPATx指的是左右两边的x完全相等,然后你还得会找规律,就是P左边的A的数量乘以P,T中间的A的数量等于T右边的A的数量。那么这道题的思路就很简单了:首先判断字符串是否有其他字符,然后判断P的数量是否为1,T的数量是否为1,P与T中间的A的数量是否大于等于1;如果以上条件都满足的话,就再判断一下A的数量的规律就行

  • 1004 水题 首先定义结构体存储学生信息,再对学生成绩进行排序,自己写了个冒泡,但其实用vector存结构体再用容器本身的sort排序更省时间

  • 1005 简单题 首先定义结构体存储每个数字的信息(主要包括数字本身以及它能覆盖的数),然后写一个函数,寻找数字a所能覆盖的数,存到数组n里,对于每一个数字的覆盖数组n,都将它与给出的这列数字比较,判断是否为关键数(这里用了三重循环,不过处理的数据量比较小,暴力还是能过)

  • 1006 水题 分解每一位数字,根据题意循环输出即可

  • 1007 水题 从2到给的数字区间找素数,然后判断相邻两个的差是否为2,计数即可

  • 1008 水题 因为不让再用数组,所以把原来的数组开大一点,存两次数据。循环右移m其实就是小标加m再取模的过程

  • 1009 水题 这道题的关键是要找到句子中空格的位置(包括句首以及句尾的空格),然后从倒数第二个空格开始,连续输出它与下一个空格间的内容

  • 1010 水题 这里我用的do-while语句输入(一个小技巧,当输入不给数据量的时候,可以用如下输入方式)然后分两种情况,即存在常数项和不存在,存在常数项又得区分是否为零多项式,因为零多项式是需要输出的,而非零多项式的常数项不输出

do
{
	cin>>a;
	count++;//计数
}while(cin.get()!='\n');
  • 1011 水题 这个数据范围用longlong定义再加一下就好

  • 1012 水题 分类,第一类数是10的倍数,第二类判断一下-1的次方再进行混合运算,第三类计个数,第四类求个和,第五类可以先用一个数组单独存起来再sort一下

  • 1013 简单题 这道题它最多就是第10000个素数,所以先把前10000个素数找到存在数组,然后输出的时候就从这个数组遍历,注意一下输出的格式

  • 1014 简单题 这道题有点坑,首先第一对相同的大写英文字符必须要在A到G之间,然后第二对相同的字符可以是0到9之间的数字,也可以是A到N之间的大写字符,最后一对相同的字符排除掉&,输出注意补0

  • 1015 中档题 这道题的数据量很大,所以很容易出现超时或者数组越界的情况。我的做法是,首先用vector进行数存储,然后用容器自带的sort函数来节省时间,这里需要自己定义一个比较函数cmp,最后说明一下scanf与printf是要比cin和cout快的。至于题目本身的逻辑很简单,分四类比较就好

  • 1016 水题,找出A中Da以及B中Db的位数即可,A、B数据量大用string存

  • 1017 中档题 简单的除法模拟 除数很大,用string存。然后从高位开始算,如果第j位大于被除数,直接除即可,然后余数再赋值给第j位;如果小于,则需要从第j+1位借位运算,余数赋值给第j+1位,特别注意只有此时才执行j++。这个循环因为有j+1,所以实际上做到了倒数第二位。对于除数是1位的,一定要单独考虑。

  • 1018 水题 定义结构体存每一回合数据,vector存结构体。每一回合根据规则判断胜负,甲胜的次数就是乙输的次数。记录甲乙每种手势胜的次数,然后找到最大的对应的下标,输出手势字符。

  • 1019 水题 这道题很简单,关键的地方在于数字要是四位的,不足四位时用append或者insert前面补0,记住无论刚开始还是每次运算后都得补0

  • 1020 水题 这道题也很简单,就是先卖单价更高的月饼,精度问题的话都用double,然后注意总库存小于总需求量的情况

  • 1021 水题 字符串输入,每位数计数即可

  • 1022 水题 进制转换,注意倒序以及和为0的情况

  • 1023 水题 将第一个不为0的数作为首位,其余位从小到大输出即可

  • 1024 简单题 这道题其实逻辑很简单,但是坑有点多。首先分类,看它的指数是大于0还是小于0。小于0的话就前面补0,大于0的话就后面加0。但有一种情况特殊,就是E的次方数小于小数部分的位数,此时小数点仍然右移,但后面不会添0(测试点4过不了就是因为这个)。还有一种情况是指数为0的情况,也必须单独考虑(但测试点里好像没有这个坑,不写也能过)

  • 1025 中档题 这道题和1075比较相似,但比它难一些。先说一下思路:先开一个很大的数组,用地址作为下标来存节点。然后把链表捋一遍,每k个节点作为一行存到二维的vector里,最后不足k的个节点单独存一下,注意输入会有节点不在链表上所以循环结束的条件应该是某个节点的next值等于-1。然后开始输出,分两种情况,首先是节点数可以整除k,这样的话就从每一行的最后一个节点输出,它的next值就是前一个节点的地址,如果是第一个节点它的next值就是下一行的最后一个节点地址,如果是最后一行的第一个就是-1;如果整除不了,之前的输出是一样的,区别就是最后不足k个节点要顺序输出。有一个坑点是首地址是-1,这样就无需输出了

  • 1026 水题 秒数转换成小时、分钟与秒,注意一下数据用double还是int定义,再就是四舍五入的小技巧 int (a+0.5)

  • 1027 水题 首先分析下给出的n个字符能用到多少个以及能输出多少行,可以推表达式,我图简单就用循环来判断了。然后先从上向下打印到输出3个字符的那一行,再向下打印,每行的字符数和空格数推一下就好

  • 1028 水题 这道题逻辑很简单,对于每一个输入的数据判断一下是否在给定的时间范围内,用vector存了以后排个序即可。但是这题有两个坑点,一个是数据量比较大,用cin和cout会超时,所以要用scanf与printf;再就是要考虑所有数据都无效的情况,单独输出

  • 1029 简单题 这道题的核心思想就在于判断字符串1中的每个字母是否在字符串2中出现了,最简单的做法就是用字符串的内置函数find(找不到的话返回结果是npos,找得到的话返回下标),最后注意一下大小写转化以及去重,不得不感叹一下内置函数的强大,可是完全记不住啊orz

  • 1030 简单题 题意很好理解,算法就是从前往后遍历,先把每一个数作为最小值;再从后往前遍历,找到满足条件的最大值,记录此时的完美数列长度,最后得到长度最大值。但这样做的话时间复杂度比较大,我们做一点小优化,就是如果当前最小数能组成的完美数列的长度小于count(当前长度)就不用比较了,也就是比较一下离最小数count远的那个数是否小于等于m倍的最小数

  • 1031 水题 用字符串存每一个身份证号,然后对前17位加权求和再取模,判断校验位是否正确

  • 1032 水题 先用一个数组存下每个学校的总分,再在这个总分数组中顺序遍历找到最大值即可

  • 1033 简单题 这道题其实和1029类似,用find判断一下输入的字符是否在坏掉的键里即可,唯一需要注意的就是上档键坏掉时大写字母无法输出

  • 1034 中档题 这道题题意很简单,但是坑确实很多。需要注意的情况是负号只能在分子,负数要有括号,假分数时前面若为0不显示,能整除时直接显示,还有就是题目说运算结果在整型范围内指的是化简后的结果,所以运算时还是用long long处理,gcd函数千万得记得!

  • 1035 中档题 这道题讲道理我觉得蛮难的,因为它考了插入排序与归并排序的细节(排序算法不懂的看这里)。这里简单说一下思路,首先做插入排序的话后面的元素次序是不变的,而归并排序后面的元素次序会改变;其次如果是插入排序下一次就再sort一下就好(注意sort的第二个参数),如果是归并排序还得再递归一次,递归的时候对末尾不足数量的子序列也得排序。

  • 1036 水题 注意为奇数时行数需要四舍五入,即int(a+0.5),然后就是分别处理第一行、中间行以及最后一行

  • 1037 水题 先将钱都转换成以纳特为单位再相减,注意一下谁大谁小,最后再转化一次

  • 1038 水题 这道题就是桶排序的思想,对于每个分数都统计下有多少个人再存在数组里,最后从数组里输出即可

  • 1039 水题 对于摊主的珠串和小红的珠串,都顺序遍历一遍,统计下他们都有哪些珠子以及有多少个,然后对于小红想要的珠子,查询摊主的那个珠子有多少个,如果小于等于小红的,就做差(不能直接做差,因为摊主可能有多余的珠子),最后如果差的和为0,就说明可以买;否则就不可以,而且差的和就是差的总珠子数

  • 1040 简单题 这道题感觉主要是看算法思想了,我原来想的是记录每个T前面有多少个A,每个A前面有多少个P,然后后面一个T的数量就是前一个T的数量加上它两之间的A能组成的数量。但看了柳神的解法发现只需要判断每个A前面有多少个P,后面有多少个T,两者相乘即可。然后取余数的时候记得每一步都要取,累加的是取余后的结果。

  • 1041 水题 这道题很简单,首先用一个结构体数组存储所有的数据,再根据给出的试机座位进行遍历求出考试座位与准考证号即可

  • 1042 水题 首先对于有空格的字符串的输入,要用getline,然后遍历每一个字符,对其中的英文字符计数,最后输出出现次数最多的字符与次数即可

  • 1043 水题 这道题考察的就是一个简单循环分支的判断,首先得到P,A,T,e,s,t各有多少个,然后再顺序输出,每输出一次其个数减一,如果个数等于0了就不用再输出了

  • 1044 简单题 这道题做的时候没看到限制了数的大小(0到169),不然更简单,唯一的坑点在于地球数字转火星文的时候如果第二位是0不用输出,比如输入13的话输出tam即可

  • 1045 简单题 这道题考察了一些简单的算法,显然如果你想对每个数据都遍历它左边的所有数是否都比它小,右边的所有数是否都比它大是会超时的。其实我们可以这样想:既然要比左边的所有数都要大那就等价于大于左边数的最大值,比右边所有数都小那就是要小于右边所有数的最小值。那么我们可以从左往右遍历一遍,找到每一位数它前面数的最大值;再从右往左遍历一遍,找到每一位数它后面数的最小值。需要注意的是第一个数的左边数的最大值可以认为是0,最后一个数的右边数的最小值可以认为是无穷大。最后这道题有一个坑点就是主元数为0时,需要再输出一个换行

  • 1046 水题 对于每一行的数据,都判断一下甲和乙喊的数字之和是否等于甲或者乙划的数字,注意一下不可以有同赢的情况

  • 1047 水题 这道题就是对于每个输入,累加一下该队伍的总成绩,然后找到成绩最高的。但是我想强调一下输入的问题,我一开始用的cin输入,因为前两个队号队员编号连在一起了,只能用一个string变量来存再转成int型这样就很麻烦,后来看到别人用的scanf输入发现超级简单,所以很多时候对于特定格式的输入可以优先考虑scanf

  • 1048 简单题 这道题逻辑不难,就是对奇数位和偶数位分别做不同的操作,但是做的时候却发现了自己对串的基本操作极其不熟练,后来参考了柳姐姐的代码,发现她的代码真的写的既简洁又漂亮,自己也写了一份。首先一定要考虑到当两个字符串长度不等时需要补足0,这里可以用类函数append,然后因为个位是第一位,为了简单我们可以将整个字符串反转一下,用swap函数。在操作的时候,因为数组下标是从0开始的,所以实际上对奇数和偶数的操作的相反的。最后如果想往字符串c里加字符,是可以直接用c+=,这我还是第一次知道。。

  • 1049 水题 这道题其实没什么好说的,关键就是找规律,我们发现第i个数(i从0开始)出现的次数是(i+1)*(n-i),最后乘起来求和就好

  • 1050 简单题 这道题就是一个简单的模拟,因为螺旋矩阵的话它一直都是右下左上的循环,然后需要注意的是在求m,n的时候先求平方根,再在平方根附近找n(至于为啥不是m可以自己想一想),接下来将排好序的数列填入二维的vector即可。两个坑点,一个是右下左上会有元素重叠,记得判断一下;还一个就是边界条件还得有元素下标小于N(比如可以考虑一下N为3的情况)。

  • 1051 水题 这道题稍微推导下就能求得A和B的表达式,但在输出的时候会比较坑。比如当数字在-0.005与0之间时,用%.2f输出的是-0.00而不是0.00,对这部分数据要特别处理一下

  • 1052 简单题 这道题注意一下每个符号集的符号都是一个字符串,所以存的时候用一个二维的vector(用二维数组的话没法判断每一维的大小)。取符号集的时候用j,k分别标记左括号与右括号的下标,再用substr取中间的子串即可

  • 1053 水题 这道题很简单,就是每一组数据遍历一遍,看看有多少天的用电量少于阈值,唯一需要注意的就是没有既是可能闲置又是闲置的情况

  • 1054 简单题 这道题的关键在于判断字符串是否合法,遍历每一个字符,如果第一个是负号就跳过,设置一个标志位判断是否出现了小数点(防止多次出现),记录一下小数点后面的位数,最后用atof函数(ascaii to float)判断数字大小是否符合要求。然后注意一下输出的时候,如果只有一个数,那个number是不加s的

  • 1055 简单题 这道题逻辑不难,首先理解一下什么叫字典序,比如Amy和Tim同样高,则认为Amy更高。实际上我们可以直接比较它们名字的字符串,更小的就更高。首先把所有人的身高从高到低排序,先处理最后一排,计算最后一排有多少人,再把最高的人放到中间,之后的人按照先左后右的顺序排,这里可以用奇偶来判断处理。对于非最后一排的,因为它们每一排的人数都确定了,就直接先找到中间的位置,再按照先左后右的规则排就好

  • 1056 水题 因为是求所有组合出来的两位数的和,我们就简单判断一下每个数字出现在十位与个位的次数都是n-1,之后累加求和就好

  • 1057 水题 遍历每一个字符,如果是英文字母,就累加一下求序号和,最后十进制转二进制数一下有多少个0和1,唯一需要注意的是输入用getline,因为它给的字符串是有空格的

  • 1058 简单题 这道题感觉更多的是在考察输入与输出,对每道题选项的存储最好用字符串,这样的话比较起来简单。遍历每个学生的每道题,对了就加分,错了记录的次数就加1

  • 1059 简单题 对于所有得奖的队伍,可以分成三种:冠军获得神秘大奖,排名素数的队伍得到小黄人(可以先把10000以内的素数找出来,而不是输入名次的时候再判断),其它队伍得到巧克力。同时我们需要两个标志位,一个表示所查的ID是否在排名里,一个是该队伍是否已经领过奖了,最后需要注意一下输出队号要是4位的,printf可以直接用** %04d **

  • 1060 中等题 这道题题意理解起来有点费劲,特别注意两个地方,首先爱丁顿数可能不是骑行公里数,其次要求的有E天骑行公里数大于E公里是至少E天,即大于等于E天的都可以。算法如下:首先找到骑行公里数的最大值与天数两者的最小值max,因为爱丁顿数必然小于等于max。然后把骑行公里数组tem从大到小排个序,max从其本身到0遍历,找到max在tem中的位置i**(tem[i]>max&&tem[i+1]<=max),如果i(骑行公里大于max的天数)大于等于max**的话,它就是爱丁顿数了。

  • 1061 水题 对于每个学生的答案,都和标准答案比较一下,如果正确就加上该题的分值

  • 1062 简单题 这道题注意两点:1.判断分数的大小最好用乘法,比如m1/n1>m2/n2等价于m1n2>m2n1,如果用小数比较的话精度可能不够
    2.两个数互质等价于两个数的最大公约数等于1,求最大公约数的函数gcd要记住:

int gcd(int a, int b)//计算最大公约数
{
	return b == 0 ? a : gcd(b, a % b);
}
  • 1063 水题 对于每一组数据,求一下两个数平方和再开方的值,找最大的即可

  • 1064 水题 对于每一个输入计算一下它的各位数字之和i,然后计数数组count[i]++,最后输出count非0的数,如果要记录有多少个不同的朋友证号的话,仅在count从0变到1的时候计数

  • 1065 简单题 这道题思路还是比较清晰的,但就是注意一下落单的人不只是没有伴侣的人,还有有伴侣但是伴侣没有来参加聚会的人。我们开两个map,tem用来存每一对情侣(注意如果a,b是情侣,要分别以a,b为关键字存一次),peo用来存储来参加聚会的人,遍历peo,如果他在tem的值为0或者他的伴侣在peo中的值为0的话,就说明他落单了。然而不知道为啥我这道题只能拿23分,(摊手

  • 1066 水题 对于每一组数据,判断一下输入是否在给定区间内,是的话就用特定值替换一下,最后输出注意要是三位

  • 1067 水题 题意很简单不多说,但有几个坑点需要注意一下。首先,正确密码是不含空白符的,但这并不意味着输入的密码也不含空白符,所以输入必须用getline而不能用cin;其次,遇到#必须要立刻退出,而不能输出Wrong answer:#;最后,当n次尝试都失败时,先输出Wrong answer:错误密码,再输出Account locked,接下来的输入不用再理会

  • 1068 简单题 这道题很坑,因为题目要求的“一点红”明明是该点的颜色与其周围8个相邻像素的颜色差充分大,但实际上测试样例里是有边缘像素点的。对于边缘像素点来说,默认它和它的那些不存在的方向上的像素点色差充分大。在开数组的时候,我们可以开大两个长度,并初始化所有像素值充分小,这样就不用判断边界情况了。还有一点就是记录每个颜色出现的次数可以用map,如果用桶排序的思想的话会浪费很多空间

  • 1069 简单题 这道题有一个坑点就是新抽中的人可能之前就中过奖了,总体思路就是第一个中奖人的序号是s,接下来中奖人的序号应该是s+=n,但如果抽中的人是已经中过奖的了,就需要s++ (我原来用的是另一种算法,不过看了柳姐姐的发现这种算法要简单很多)

  • 1070 简单题 这道题严格来说是道数学题,因为要让总绳长最大,那么越长的绳子折叠的次数应该越少,越短的绳子折叠的次数应该越多。我们先把绳长从低到高排序,先选出的两根最短的绳子的折叠次数应该n-1,接下来每根绳子的折叠次数逐次减1

  • 1071 水题 对每一组数据先判断下下注是否超过筹码总数了,再判断是输是赢,唯一需要注意的是如果全输光了整个游戏就结束了,也就是不用再考虑接下来的投注了

  • 1072 水题 对于每一个学生,遍历他所有的物品看是否在缴纳清单内,在的话就记录一下,最后输出物品编号要注意必须是四位

  • 1073 中档题 这道题其实和1058是很相似的,但是1058里并不需要判断那种少选的情况,而且也不需要统计每道题的每个选项的错误次数。其实我觉得这道题蛮难的,可是PAT上这道题的AC率却挺高,可能是有更一般的解法吧。这里我推荐一种更好的解法:我们分别用00001,00010,00100,01000,10000(十进制为1,2,4,8,16)表示正确选项a,b,c,d,e。如果正确选项是ae,那么其对应的二进制为10001(十进制是17),如果考生的选择也是ae(10001),那么两者异或结果为0;如果考生没有全选对,那么结果就是1。接下来我们再判断少选与错选,如果之前的异或结果为1且考生的选择与正确选项或的结果为1,那么说明考生少选了(比如考生选择了a,也就是00001)。而对于每个题目每个选项错误次数的判断,我们可以用之前异或的结果与每一个选项对应的数做与运算,如果结果非0,则说明考生该选项少选或错选,注意这里的错误既包括少选又包括错选。

在这道题的同时,我想强调一下几个输入输出的问题:
1.scanf和printf是要比cin和cout快很多的
2.scanf在读入字符的时候,是会读入空格的,所以如果你用scanf循环读入字符,一定要小心
3.如果你用getline读入字符串而且前面还有别的输入时,记得用getchar()读掉上一行末尾的换行符,不然getline的第一个读入就会是换行符

  • 1074 简单题 这道题和1048比较相似,都是先把数进行反转,然后补0让两个数长度相等再每一位做加法运算,最后再反转输出。这里需要注意的是最高位可能出现的进位以及反转后结果的前几位可能是0且不要输出。唯一的坑点在于结果可能就是0,所以对这种情况要单独输出一下

  • 1075 中档题 这道链表题还是有一定难度的,想要AC不是那么容易(和1025有一些相似)。说几点注意的地方:
    1.把存储节点的数组开大,存储的时候节点的下标就是其地址,而不是顺序存储,然后再遍历一遍找下一个节点,这样肯定会超时,然而由于数组开的太大,代码在vs都没法运行,只能直接交到PAT测评机让它跑(PAT对时间复杂度的要求远高于空间)
    2.在将所有节点根据其数据域大小分别存放到三个vector里时,循环终止的条件不应该只是i小于节点个数,还有某个节点的next域是否为-1,因为所给数据可能有不在链表上的节点,不判断有一个测试点是过不了的
    3.将三个vector合并可以用内置的insert函数
    4.输出每一个节点的next值时可以直接输出下一个节点的地址,而不需要提前把每个next值修正一遍,这样可以大大节省时间

  • 1076 水题 很简单的题目,思路就是找到每道题的正确选项再转成对应的数字字符即可

  • 1077 水题 这道题就注意两个地方:首先对符合要求的分数进行排序,这样可以很容易去掉最高分与最低分;再就是在之前的运算中都用double精度,最后再四舍五入成整数,如果一开始就用int精度会有误差

  • 1078 水题 首先输入用getline,因为字符串里有空格。如果是压缩,就要对相同的字符进行计数,如果出现了多次再把该数字从整型转成字符型存到字符串里;如果是解压,就要把数字从字符型转成整数型再循环打印字符

  • 1079 简单题 这道题考察两个点:一个是用string做大数加法运算,算的时候需要注意一下最高位的进位;另一个就是reverse函数,它可以对字符串进行反转直接判断回文

  • 1080 简单题 这道题改了很久还是只能拿19分,也看了很多人的代码,发现思路都是一样的,但我就一直AC不了,(摊手。思路如下:首先我们可以利用map完成学号到平时编程成绩、学号到期中成绩以及学号到期末成绩的映射(map的一些常用操作我会在1085总结)。在平时成绩这块,我们可以只处理分数大于等于200的,然后遍历平时成绩的map,再计算每一位学生的总评成绩,大于等于60的就合格,唯一需要注意的是学生可能没有期中成绩(用期中的map是否为0判断),最后自己写个比较函数再sort排序输出即可

  • 1081 水题 这道题有一个比较坑的地方就是在用cin读个数n和getline读字符串之间必须用getchar()把第一个换行符读了。其它的就是简单的分支比较了,但要注意一下比较的优先级,首先是长度是否过短,再是是否有非法字符,最后才是是否缺数字、字母或者完美

  • 1082 水题 每组数据计算下到靶心的距离,找最大值与最小值即可

  • 1083 水题 做一次循环,用它自己减去它的次序,然后用桶排序的方式存,最后输出出现次数大于等于2的

  • 1084 水题 这道题其实和1078挺相似的,就是遍历出每个字符重复出现的次数,再按照字符、出现次数的方式输出,和1078不同的地方就是这里出现了一次也要输出一个1,而且这里出现次数没有超过10次的

  • 1085 中档题 这道题AC的唯一方法就是用map容器。首先面说一下这道题的大体思路:对于每一组输入,先将学校名的字符串全转成小写(利用tolower函数),再对学校与成绩、学校与人数的map处理。然后遍历学校成绩的map,将相关信息存入vector里。最后自己写个cmp比较函数进行输出。但这里需要注意一下排名的输出:因为排名存在并列的情况,所以如果这个学校和前一个学校成绩相同(并列)则排名不变,否则排名为其数组下标加1

map实际上可以认为是一种哈希,就像数组一样,只不过数组是从整型数到其他类型参数的映射,而map可以是任何类型参数到任何类型参数的映射。实例化map需要两个参数,第一个是关键字,另一个是关键字对应的值。关于map的一些常见操作有:实例化:map<string,int> m;插入数据:m[string]=int;遍历map:for (auto i = m.begin(); i != m.end(); i++)或者for (map<string,int>::iterator i = m.begin(); i != m.end(); i++);查找:m.find(string),若其等于m.end(),则未找到,否则找到了。此外,map中两个关键字分别是i->first,i->second,其中第二个关键字用数组方式取出也可以。需要特别注意的是,在容器m里,string对应的int的初值为0!

  • 1086 水题 倒序输出最好的方法就是利用字符串流stringstream将整数转为字符串,唯一需要注意的是倒序后前面的0不要输出

  • 1087 水题 取下整数直接用整数的除法就好了,求多少个不同值的话可以用开一个大数组,出现过的是非0值,没出现的是0

  • 1088 水题 简单的暴力思想,遍历所有二位整数求甲的分数,需要特别注意丙点的分数可能是浮点数

  • 1089 水题 这道题简单来说就是仅有一个狼人说谎且仅有一个好人说谎,开两个数组say与real,前者存每个人说的,后者存实际上每个人的身份。遍历每种可能的结果,并判断在每种结果下是否仅有一个k满足real[k] < 0 && say[k] != real[abs(say[k])](狼人说谎)且另一个k满足real[k] > 0 && say[k] != real[abs(say[k])](好人说谎)

  • 1090 简单题 这道题得用map存一下不相容物品的清单,但是这道题坑的地方就在于与一个物品不相容的可能有多个,因此这就是一个一对多的关系了,解决方案就是把每个key的value设置成一个vector,其它的判断就很简单了

致谢

最后要特别感谢柳诺姐姐的博客提供的部分代码思路

About

PAT乙级代码

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages