PAT乙级
chaosjey li
这个作者很懒,什么都没留下…
展开
-
B 1095 解码PAT准考证(较复杂的结构体排序应用)
#include<bits/stdc++.h>using namespace std;struct id{ string num; int score; char level; string site; string data; string last; id(string a,int b ):num(a),score(b){ level=num[0]; site=num.substr(1,3); data=num.substr(4,6); last=num.原创 2020-07-17 21:37:28 · 115 阅读 · 0 评论 -
B 1094 谷歌的招聘(字符串的处理+素数的判断+测试点3/4分析)
题目思路通过substr函数,遍历输入的s,每次记录一个长度为k的子串,转换为整型进行素数的判定,并输出。需要注意的是测试点3、4:当最后字符串的长度不够k时,就终止循环输出404,即循环的结束条件是i<=l-k; 而非i<l;AC代码#include<bits/stdc++.h>using namespace std;bool isprime(int n){ if(n<=1) return false; else { for(int i=2;i*i&原创 2020-07-17 00:27:48 · 232 阅读 · 0 评论 -
B 1093 字符串A+B(字符串+基础的散列应用)
题目思路这题目容易理解错误,容易想复杂。简单来说,就是给了两个字符串,将其加到一起。再进行顺序输出,前面已经输出过的就不再输出,区分大小写。(就是一个很简单的散列的应用,不要想复杂)AC代码#include<bits/stdc++.h>using namespace std;int main(){ string s1,s2; getline(cin,s1); getline(cin,s2); string s3; s3=s1+s2; int hash[200]=原创 2020-07-17 00:04:57 · 90 阅读 · 0 评论 -
B 1092 最好吃的月饼(结构体排序)
题目思路用一个结构体储存月饼编号和销量,并将销量初始化为0;创建结构体数组储存每种月饼的数据。最后用sort函数排序输出。AC代码#include<bits/stdc++.h>using namespace std;struct moon{ int id; int sell; moon(){ sell=0; }};bool cmp(moon a,moon b){ if(a.sell!=b.sell) return a.sell>b.sell; el原创 2020-07-16 22:08:41 · 145 阅读 · 0 评论 -
B 1091 N-自守数(字符串与整型转换)
题目思路一开始记错题目,以为只是最后两位数,所以用了整型取模最后几位的方法,比较麻烦。注:测试点3的k是三位数。这题由于不定长度,最好还是用字符串转换比较方便。我也做了一遍放在下面。AC代码用整型取模:#include<bits/stdc++.h>using namespace std;int main(){ int m; cin>>m; for(int i=0;i<m;i++){ int k; cin>>k; int flag=原创 2020-07-16 21:10:04 · 81 阅读 · 0 评论 -
B 1090 危险品装箱(利用map映射vector)
题目思路柳神niubility,从柳神那学到的。利用map映射一个<int,vector< int >>输入时,对一组不相容的物品编号互相push_back储存。之后对m组输入进行判断,每次定义一个数组a作为散列,记录编号是否出现。一个数组v记录输入的编号;对每个输入的编号,遍历mp【v[cnt] [ cnt1 ] 】,若a数组中标记为出现,即为有不能共存的物品,flag为1;最后再循环外进行flag判定输出。#include<bits/stdc++.h>原创 2020-07-16 15:35:44 · 156 阅读 · 0 评论 -
B 1089 狼人杀-简单版(思路不好找)
题目思路做起来思路不好找,参考了柳神的代码思路。画了个比较简单的流程图。AC代码#include <iostream>#include <vector>#include <cmath>using namespace std;int main() { int n; cin >> n; vector<int> v(n+1); for (int i = 1; i <= n; i++) cin &原创 2020-07-15 22:16:28 · 180 阅读 · 0 评论 -
B 1088 三人行(两位数转换)
题目思路这题有几个考点:数学问题,如何根据x,y找甲乙丙;我的思路:取甲乙只差δ=x倍的丙,乙=y倍丙。通过遍历丙,找甲乙,并通过判断乙的逆序减甲的绝对值是否等于δ,来判定三个数是否成立; for(int i=1;i<100;i++){ d3=i; delta=x*d3; d2=y*d3; s2=to_string(d2); reverse(s2.begin(),s2.end()); d1=stoi(s2);//d1为d2的反转 if(abs(原创 2020-07-15 19:10:01 · 172 阅读 · 0 评论 -
B 1087 有多少不同的值(散列的简单应用)
题目思路用散列就行。pat的题怎么有的简单的不行,有的又难又绕- -;AC代码#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; int hash[100000]={0}; int d=0,cnt=0; for(int i=1;i<=n;i++){ d=i/2+i/3+i/5; hash[d]++; if(hash[d]==1) cnt++; }原创 2020-07-13 22:40:01 · 110 阅读 · 0 评论 -
B 1086 就不告诉你(to_string以及字符串的处理,测试点1,2测试用例)
题目思路不是大整数,1000的话乘积最多9位,int型就能保存。前半部分无难点,用to_string即可。容易出错的是测试点1,2。当乘积末位为0时,输出时不输出首位的0.测试用例:11 10(测试点2)应输出1111 100(测试点1)应输出11AC代码#include<bits/stdc++.h>using namespace std;int main(){ int a,b; cin>>a>>b; long long d=a*b; s原创 2020-07-13 22:27:02 · 135 阅读 · 0 评论 -
B 1085 PAT单位排行(map储存信息,结构体排序)
题目思路用一个结构体储存输入的学生信息,一个结构体储存学校的信息;用一个map储存学校的总成绩,一个map储存学校的学生人数;注意最后的加权成绩,需要汇总后再换为整型;最后的排序输出通过结构体用sort函数进行排序;做完发现自己的思路基本和柳神一致hhh。不过最后排名的输出测试点后两个没通过,就参考了柳神的代码。AC代码#include<bits/stdc++.h>using namespace std;struct stu{ //记录学生信息 s原创 2020-07-13 19:24:10 · 137 阅读 · 0 评论 -
B 1084 外观数列(找规律处理字符串)
题目思路说实话,这题我确实没有比较好的思路。代码参考的是柳神的。做法是:用字符串储存d。通过循环,遍历到所求的第n项。求每一项时,外循环遍历目前字符串,内循环寻找和前一位不同的字符位置。当找到不同的字符或者遍历完后跳出内循环,此时j就记录了和前一位字符不同的字符的下标。通过j-i就得到了前一位字符的出现次数。再用to_string加到字符串t中。令d=t。继续循环。AC代码#include<bits/stdc++.h>using namespace std;int原创 2020-07-12 21:13:56 · 124 阅读 · 0 评论 -
B 1083 是否存在相等的差(采用集合set)
题目思路由题意可知需要按差值排序,所以我想到了用集合set(可以自动排序且去重)。我也看了其他博主的代码,也可以利用map容器、以及不用stl的容器,通过散列遍历(可以参考柳神的)AC代码#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; int a[n]={0}; int cha[10001]={0};//记录差值出现的次数 set<int> st;原创 2020-07-12 15:23:06 · 94 阅读 · 0 评论 -
B 1082 射击比赛(it迭代器查找map键值)
题目思路用map映射string,double型来记录选手编号和举例靶心的距离d;求d用根号下的平方和,sqrt函数。用double型便于比较;输入时就记录最大值和最小值的编号和数值,最后用it迭代器查找输出。AC代码#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; map<string,double> mp; string s; double d,原创 2020-07-12 11:30:47 · 98 阅读 · 0 评论 -
B 1081 检查密码(常规题)
题目思路常规题,再注意一下getline在cin后需要吸收一个换行符。cin与getline()的区别: getline()中的结束符,结束后,结束符不放入缓存区; cin的结束符,结束后,结束符还在缓存区;所以在使用 cin 后若要使用 getline() 必须要把前面cin遗留的结束符处理掉,解决方法为:在使用getline()之前,加入一行getline()来处理cin留下的结束符;AC代码#include<bits/stdc++.h原创 2020-07-12 00:39:48 · 113 阅读 · 0 评论 -
B 1080 MOOC期终成绩(利用map记录结构体中的字符串)
题目思路难点是在于需要以字符串作为下标识别并储存多个数据。可以采用map映射一个<string,struct> ,但需要重载运算符。我看到有博主就是这么做的。可以参考这位博主的代码PAT-B1080 MOOC期终成绩(25 分)除此之外,也可以用一般的map<string,int>进行映射,难点的解决是通过定义一个结构体类型的vector数组,一个cnt计数。在map映射时,对于选中的数据map 【string】=cnt++ 且同时使数组+1并记录字符串及数据。 相当原创 2020-07-11 23:34:15 · 95 阅读 · 0 评论 -
B 1079 延迟的回文数(回文数、字符串与整型的相互转换)
题目思路涉及到的几个考点:回文数的判定,两种方法(整型判定及字符串判定) bool huiwen(string a,int i,int j){ if(i>=j) return true; else { if(a[i]!=a[j]) return false; else return huiwen(a,++i,--j); }}字符串转换为整型:stoi 及 stod 函数;字符串的反转:reverse(s.begin(),s.end());整型转换为字符原创 2020-07-11 00:29:59 · 112 阅读 · 0 评论 -
B 1078 字符串压缩与解压(字符串处理+利用stoi函数)
题目思路总体而言,因为不确定输入字符串的个数,所以用getline输入一行中所有字符串再进行遍历讨论;对于解压:需要识别字符串中的数字,并输出n个后一位的字母。问题在于数字不能确定是几位。若默认最多出现两位数字,则有两个测试点会出错。解决办法是通过新建字符串ss,当出现数字则加入ss中,再利用stoi函数转为整型输出。对于压缩:用一个字符记录前一位,每次出现的与前一位相同时cnt计数,当不同时再由cnt的大小来进行判断输出。AC代码#include<bits/stdc++.h>原创 2020-07-10 01:04:42 · 112 阅读 · 0 评论 -
B 1077 互评成绩计算(求平均数、简单的四舍五入)
题目思路去除一次最高分最低分:找max和min,求出的总分再减max和min;结果四舍五入取整数:用int = round(double);去掉非法得分:判断范围,用cnt计数,最后求平均数时,记得cnt-2//最高最低分不要;AC代码#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; int m; cin>>m; double score=0,teach原创 2020-07-09 00:56:27 · 286 阅读 · 0 评论 -
B 1076 Wifi密码(固定格式输入、类似B1058)
题目思路类似B 1058,但更为简单。两个循环,外循环为题目,内循环四次为选项数。注意的就是内循环每次需要一个getchar(),吃掉空格和换行符。AC代码#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; char c,a; int ans[n]={0}; for(int i=0;i<n;i++){ for(int j=0;j<4;j++){原创 2020-07-09 00:11:30 · 256 阅读 · 0 评论 -
B 1075 链表元素分类(散列+结构体实现链表分类)
题目思路PAT乙级的考点对数据结构涉及很少,例题里一共出现了两次链表,但其实两次都可以用散列来实现。本题用散列的思路参考了柳神。用了散列,hash【address】来储存地址对应的值。分类时再定义三个数组,来储存address。输出时,比较取巧。先输出当前address 当前data 下一个address 最后再输出一个-1指向空节点。不过还是建议学一学链表,这题用链表也不难。AC代码散列实现:#include<bits/stdc++.h>using namespa原创 2020-07-08 23:33:23 · 111 阅读 · 0 评论 -
B 1074 宇宙无敌加法器(字符串的处理+进制转换)
题目思路进制转换+字符串的处理,算是pat常考题型了,之前就考过很多道类似的。本来用了字符串+进制转换函数。但代码太麻烦了,需要用指针作为返回值。参考了柳神的思路,更简洁方便。以0补齐两段字符串,使之长度相同。逆序遍历,每位的答案就是: (s1[i] - ‘0’ + s2[i] - ‘0’ + carry) % mod + ‘0’每位的进位就是:(s1[i] - ‘0’ + s2[i] - ‘0’ + carry) / mod...原创 2020-07-08 18:22:26 · 101 阅读 · 0 评论 -
B 1073 多选题常见计分法(B 1058高阶版本)
题目思路参考了柳神和秦神的代码。膜拜一下柳神,把选项换成二进制,来进行异或判断是否选对。a:0000 0001(B) = 1(D)b:0000 0010(B) = 2(D)c:0000 0100(B) = 4(D)d:0000 1000(B) = 8(D)e:0001 0000(B) = 16(D)如果选项abc就是:0111异或:相同取0,相异取1...原创 2020-07-05 22:45:54 · 119 阅读 · 0 评论 -
B 1072 开学寄语(map记录散列,思路同B 1069)
题目思路用map做一个映射,默认mp为0,违禁品mp为1,对每个学生输入的物品进行判断。思路和B 1069一模一样。注意:如果用<int,int>映射,最后需要控制输出格式。否则测试点2错误;AC代码#include<bits/stdc++.h>using namespace std;struct s{ string name; int k;};int main(){ int n,m; cin>>n>>m; map<i原创 2020-07-05 12:51:46 · 92 阅读 · 0 评论 -
B 1071 小赌怡情(普通整型的比较)
题目思路比较简单,没什么好说的。。。AC代码#include<bits/stdc++.h>using namespace std;bool cmp(int a,int b){ return a<b;}int main(){ int T,k; cin>>T>>k; int n1,b,t,n2; for(int i=0;i<k;i++){ cin>>n1>>b>>t>>n2;原创 2020-07-05 11:36:30 · 91 阅读 · 0 评论 -
B 1070 结绳(考点:对题目的理解、向下取整)
题目思路总体来说代码简单,不难。关键是对题目的理解,要求是能串成的绳子的最大长度。就是说越早对折的绳子,之后每一回的对折次数都会增加。所以要让短的先,长的在后。若按题目给出的顺序,结果会是10。关于向下取整,直接利用四舍五入round,如果四舍五入结果大于原数,则直接减1。(看了柳神代码……直接用了int型,系统默认向下取整了- 。-)AC代码#include<bits/stdc++.h>using namespace std;int main(){ int原创 2020-07-05 00:35:30 · 175 阅读 · 0 评论 -
B 1058 选择题(对scanf(“ “)、scanf(“(%d“),&k)、scanf(“)“)的应用)
题目思路这题考的其实不难,关键点是学生答案的输入用()来分隔每一道题。用cin就只能用string保存,再遍历判断,非常麻烦。说实话,我非常不喜欢用scanf,直到这题教我做人……scanf对于要求格式的输入,真香!代码参考自秦神AC代码#include<bits/stdc++.h>using namespace std;struct test{ int score; int ans; int right; string rans;};int main(){ i原创 2020-07-05 00:04:25 · 180 阅读 · 0 评论 -
B 1068 万绿丛中一点红(map的应用)
题目思路对于所有颜色出现次数的记录,可以直接用int到int的映射,作为散列记录。关于对颜色的判定,参考了柳神和秦神的代码;以任意a[i][j]为中心,需要进行8次判定。建立一个二维数组:int dir[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};对任意的i,j,使i+数组每列前一位=x,j+每列后一位=y,即可得到上表。判定条件为,当x>=0&&&原创 2020-07-03 17:56:58 · 138 阅读 · 0 评论 -
B 1069 微博转发抽奖(map映射的应用)
题目思路参考的吉大秦少游大佬的思路,非常简洁明了。用string类型的数组记录输入,用map做一个string到int型的映射,通过键值来记录是否输出。注:map的默认键值为0AC代码#include<bits/stdc++.h>using namespace std; int main(){ int m,n,s; cin>>m>>n>>s; int i; map<string,int> mp; //默认键值为原创 2020-07-03 15:13:19 · 116 阅读 · 0 评论 -
B 1067 试密码(字符串的输入、测试点2、5分析)
题目思路题目坑点是:题目只明确了正确密码中无空格,输入的密码可能有空格(测试点5),所以要用getline,注意getline输入字符串时,前面需要用getchar吸收前一个输入的换行、结束符号。题目所说的保证有一次尝试不对,测试点2是直接输入#结束,需要加一个输入为#号的特殊情况;AC代码#include<bits/stdc++.h>using namespace std; int main(){ string code; cin>>code; int原创 2020-07-02 16:03:36 · 283 阅读 · 0 评论 -
B 1061 判断题(简单数组统计)
题目思路比较简单,看代码吧AC代码#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; int m; cin>>m; int score[m]={0}; for(int i=0;i<m;i++) cin>>score[i]; bool ans[m]={0}; for(int i=0;i<m;i++) cin>>ans[i原创 2020-07-02 00:27:57 · 121 阅读 · 0 评论 -
B 1066 图像过滤(二维数组、定长度输出)
题目思路用一个二维数组来储存,后续setw 加setfill实现输出000即可。AC代码#include<bits/stdc++.h>using namespace std; int main(){ int m; cin>>m; int n; cin>>n; int A,B,replace; cin>>A>>B>>replace; int a[m][n]={0}; int temp=0; for(in原创 2020-07-02 00:22:58 · 90 阅读 · 0 评论 -
B 1065 单身狗(散列的应用)
题目思路这题明明写的是200ms要求,但可以暴力破解,这是我万万没想到的- -;散列记录夫妻,hash【id】=cpid;再用一个散列记录到场;之后暴力破解遍历0~100001;测试点3:注意00000的输出,有格式要求,不能输出成0;AC代码#include<bits/stdc++.h>using namespace std; int main(){ int n; cin>>n; int hash[100010]; memset(hash,-1,siz原创 2020-07-01 21:45:51 · 90 阅读 · 0 评论 -
B 1064 朋友数(散列,字符串转整型或整型求各位和)
题目思路用string来记录数字的输入,并相加求各位和;用散列hash【num】来判断朋友号是否出现;AC代码#include<bits/stdc++.h>using namespace std; int main(){ int n; cin>>n; string s; bool hash[10001]={0}; int num=0; int a[1000]={0},cnt=0; for(int i=0;i<n;i++){ cin>原创 2020-07-01 15:33:44 · 101 阅读 · 0 评论 -
B 1063 计算谱半径(开方、四舍五入)
题目思路用double型储存,求出每个数的实部和虚部平方和的开方,找最大值。固定两位小数输出就直接AC了,不用再进行一次round四舍五入。AC代码#include<bits/stdc++.h>using namespace std; int main(){ int n; cin>>n; double a,b,m; double max=0; for(int i=0;i<n;i++){ cin>>a>>b; m=sqrt原创 2020-07-01 15:19:56 · 101 阅读 · 0 评论 -
B 1062 最简分数(最大公约数、分数、交叉相乘法)
题目思路一开始题目不是很理解,其实就是找两分数a,b间,以K为分母的分数。需要用到分数的交叉相乘法来比大小:首先比较a,b,确保小的在前,大的在后;令分子从1到k开始遍历,用分子和分母的最大公约数是否为1来判别是否为最简分数。用交叉相乘法比较分数和a,b的大小;进行输出,行末不能有空格。AC代码#include<bits/stdc++.h>using namespace std;struct fraction{ int up; int down;};int原创 2020-07-01 14:52:03 · 392 阅读 · 0 评论 -
B 1060 爱丁顿数(找规律)
题目思路从小到大排序,暴力破解会超时。此时通过比较每天骑行的公里数,与剩余的天数来判断。当第i天骑行的公里数a[i]大于剩余天数n-i时,n-i天即为最大E值。通过降序排列,从1开始编号,a【1】为最后一天骑行公里数,此时编号的1为骑行超过该天公里数的天数。通过判断a【i】> i 来记录E。(此处代码思路参考柳神)AC代码升序排列#include<bits/stdc++.h>using namespace std;int main(){ int原创 2020-06-28 15:13:16 · 108 阅读 · 0 评论 -
B 1059 C语言竞赛(素数+结构体+散列)
题目思路思路是用一个结构体散列来记录排名,用一个整型数组散列来记录数据的录入\输出关于测试点2:是由于素数判别的错误,会误判9为素数。检查素数判别函数即可。AC代码#include<bits/stdc++.h>using namespace std;struct stu{ int price;};bool isprime(int n){ if(n<=1) return false; for(int i=2;i*i<=n;i++){ if(n%i==0原创 2020-06-27 23:14:28 · 85 阅读 · 0 评论 -
B 1057 数零壹(字符串的统计+进制转换)
题目思路不饶,先统计序号相加,再进行进制转换即可。AC代码#include<bits/stdc++.h>using namespace std;int main(){ string s; getline (cin,s); int n=0; for(int i=0;i<s.length();i++){ if(s[i]>='a'&&s[i]<='z') n+=s[i]-'a'+1; else if(s[i]>='A' &&原创 2020-06-27 23:08:34 · 83 阅读 · 0 评论 -
B 1056 组合数的和(找规律遍历)
题目思路3个数时:2、5、825、2852、5882、854个数时:2、5、8、925、28、2952、58、5982、85、8992、95、98不难发现,n个数需要遍历n次,每次的十位为第i个数、个位为其他数。AC代码#include<bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; int a[n]={0}; int num=0; for(int i=0;i<n原创 2020-06-27 23:05:59 · 341 阅读 · 0 评论