PAT乙级真题题解
ff
SYaoJun
这个作者很懒,什么都没留下…
展开
-
PAT乙级题解
1001 害死人不偿命的(3n+1)猜想 (15 分)原创 2019-08-28 21:39:37 · 1045 阅读 · 0 评论 -
1107 老鼠爱大米 (20 分)
思路求最值AC代码#include <iostream>using namespace std;const int N = 110;int g[N];int main() { int n, m; cin >>n >>m; int x; int res = 0; for(int i = 0; i < n; i ++) { g[i] = 0; for(int j = 0; j < m; j++) { cin >>原创 2022-01-14 23:16:08 · 278 阅读 · 0 评论 -
1105 链表合并 (25 分)
思路考查点静态链表排序思路:正序遍历的时候顺便记录他的前缀节点,双向链表的思路。然后将两个链表合并到vector中,利用vector输出结果。AC代码#include <iostream>#include <vector>using namespace std;const int N = 1e5+5;struct node{ int add, data, next, pre;}E[N];void print(int head, int t原创 2022-01-14 23:13:53 · 431 阅读 · 0 评论 -
1109 擅长C (20 分)
分析考查点按行读入字符串哈希表映射AC代码#include <iostream>#include <string>#include <vector>using namespace std;int main() { string str; vector<string> w; for(int i = 0; i < 26; i++) { for(int j = 0; j < 7; j++) { getli原创 2022-01-14 23:08:24 · 431 阅读 · 0 评论 -
1110 区块反转 (25 分)
分析注意一个比较坑的点:题目给的点可能不在链表中,所以我们只需要把链表中的数据排序。这种坑真不像个人出的题目。思路按照每个节点具有两重属性,所以这里可以用双关键字排序。第一个关键字:当前是第几个块。第二个关键字:当前是这个块中的第几个元素。详细讲解:见B站视频:我不是匠人AC代码#include <iostream>#include <vector>#include <algorithm>using namespace st原创 2022-01-14 22:35:45 · 364 阅读 · 0 评论 -
1104 天长地久 (20 分)
分析通过率感人的题目考点搜索剪枝排序质数最大公约数思路首先看到数值的位数最高达9位,所以暴力枚举肯定是会超时的,然后看到数据范围比较小,可以直接枚举加剪枝。我一直卡在第三个测试点,这里是需要对结果进行排序。后来我直接用set存,然后输出就对了。注意:这道题还可以考查一些东西,虽然我想到了,但是题目没有考,反而考了一个排序,没有仔细读题,害我找了半天。如果位数最大包含10位,这里可以考查整数溢出。正整数的首位不能为0,比如010,虽然占了三位,但是数值本原创 2022-01-14 19:40:17 · 533 阅读 · 0 评论 -
1108 String复读机 (20 分)
分析模拟题代码#include <iostream>#include <string>#include <cstring>using namespace std;const int N = 10;int g[N];int main() { string s; cin >>s; memset(g, 0, sizeof g); for(auto c: s) { if(c =='S') g[0]++; else if(c =='原创 2022-01-11 23:32:56 · 533 阅读 · 0 评论 -
1102 教超冠军卷 (20 分)
PAT1102 教超冠军卷 (20 分)原创 2022-01-11 23:18:57 · 292 阅读 · 0 评论 -
1101 B是A的多少倍 (15 分)
PAT1101原创 2022-01-11 23:15:55 · 127 阅读 · 0 评论 -
1106 2019数列 (15 分)
分析视频讲解B站:我不是匠人考查知识点模拟注意当n小于4时,要特殊处理。代码#include <iostream>using namespace std;int main() { int n; cin >> n; string s = "2019"; for(int i = 4; i < n; i++) { s += (s[i-1]-'0' + s[i-2]-'0' + s[i-3]-'0' + s[i-4]-'0') % 10 +原创 2022-01-11 00:15:29 · 322 阅读 · 0 评论 -
1102 教超冠军卷 (20 分)
分析视频讲解B站:我不是匠人考查知识点排序思路:由于输出的值比较少,直接用变量保存输出的值。注意:不要初始化为0,要把销售额初始化为负数。AC代码#include <iostream>#include <algorithm>using namespace std;const int N = 1e4+5;struct node{ string id; int price; int count; bool operator <原创 2022-01-11 00:04:38 · 362 阅读 · 0 评论 -
1101 B是A的多少倍 (15 分)
分析视频讲解B站:我不是匠人考查知识点取模保留小数点AC代码#include <iostream>#include <string>#include <cmath>using namespace std;int main(){ int A, D; cin >> A>> D; string t = to_string(A); int P = pow(10, D); int PP = pow(10, t.siz原创 2022-01-10 23:43:13 · 297 阅读 · 0 评论 -
1103 缘分数 (20 分)
思路模拟代码/*1. 遍历每个值去判断2. 溢出int,用long long3. 注意乘法溢出 */ #include <iostream>#include <cmath>using namespace std;using LL = long long;int main() { int m, n; cin >>m >> n; bool tag1 = false; for(int i = m; i <= n; i++)原创 2022-01-10 22:28:24 · 448 阅读 · 6 评论 -
1099 性感素数 (20 分)
步骤判断N本身是不是性感素数a. N和N-6b. N+6和N从N+1枚举,判断这个数是不是性感素数a. 判断两种情况ⅰ. N-6ⅱ. N+6b. 判断一种情况ⅰ. N+6,(N+1和N+7)漏了N+1~N+5比N小的时候的匹配情况。ⅱ. 预先将N到N+5之间这几个数处理掉判断素数:a. 优化到根号n代码直接讨论两种情况#include <iostream>#include <cmath>using namespace std;inline原创 2022-01-09 14:17:43 · 756 阅读 · 1 评论 -
PAT乙级1096 大美数 (15 分)
代码/*1. 4不同正因子 1和本身也是它的因子2. 求和3. N 整除 B 表示:B能被N整除 4. Yes首字母大写 */ #include <bits/stdc++.h>using namespace std;int main() { int K; cin >> K; int N; for(int i = 0; i < K; i++){ cin >> N; vector<int> vt; for(in原创 2022-01-08 14:46:34 · 734 阅读 · 0 评论 -
1001. 害死人不偿命的(3n+1)猜想 (15)
查看原题目请点我 题外话:这是入门题,我最近想把PAT乙级的题目都用python实现一遍,但是发现还是挺吃力的,python还没学好,暂时只更新简单的题吧。估计也没什么人会看到,方便以后自己查阅吧。代码有什么问题欢迎大家找我交流。C/C++版#include<cstdio>int main(){ int n; scanf("%d",&n); ...原创 2018-03-14 14:24:52 · 492 阅读 · 0 评论 -
1002 写出这个数 (20 分)
查看原题目请点我 解题思路:主要是字符串的处理,首先求和,然后把求得的数字转化为数字,再用对应的数字映射导对应的拼音进行输出。#include<cstdio>#include<cstring>char stt[][8]={"ling","yi","er","san","si","wu","liu",&原创 2018-03-15 12:17:18 · 369 阅读 · 0 评论 -
1004 成绩排名 (20 分)
C/C++版#include<cstdio>#include<algorithm>using namespace std;const int maxn = 1005;struct E{ char name[15]; char courses[15]; int score; bool operator <(const E &b)const{...原创 2019-08-29 11:09:24 · 210 阅读 · 0 评论 -
1005 继续(3n+1)猜想 (25 分)
继续(3n+1)猜想 (25) 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对n=3进行验证的时候,我们需要计算3、5、8、4、2、1,则当我们对n=5、8、4、2进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这4个数已经在验证3的时候遇原创 2018-01-14 20:15:00 · 336 阅读 · 0 评论 -
1007 素数对猜想 (20 分)
https://www.patest.cn/contests/pat-b-practise/1007吐槽:本来是道简单题,可是我提交的时候,老是有段错误,我猜可能是开的数组不够大,但是真正原因是没有置零的缘故。 要细节呀!#include#include#define N 200005int p[N];int prime[N];int k=0;void prime_table原创 2019-08-28 21:17:42 · 235 阅读 · 0 评论 -
1008 数组元素循环右移问题 (20 分)
循环左移思路:长度为n,移动m位,相当于移动m%n次1.前m%n位反转2.后n - m%n位反转3.整体反转例如: abcde移动两位: cdeab循环右移则第三步整体反转先执行,再执行第一二步#include<cstdio>#include<cstring>#include<algorithm>using namespace st...原创 2019-01-23 14:35:23 · 183 阅读 · 0 评论 -
1009 说反话 (20 分)
方法1用标准模板库,简洁而清晰。#include<string>#include<iostream>#include<vector>#include<algorithm>using namespace std;int main(){ vector<string> v; string s; while(cin>&g...原创 2019-01-23 13:00:48 · 488 阅读 · 2 评论 -
1010 一元多项式求导 (25 分)
题目链接:https://www.patest.cn/contests/pat-b-practise/1010 解题思路:这道题很简单,但是有个坑,就是当没有任何非零项时,要输出0 0#include int main(){ int x,y; int tag =0; while(scanf("%d%d",&x,&y)!=EOF){ if(y!=0){原创 2018-02-05 00:44:42 · 234 阅读 · 2 评论 -
1012 数字分类 (20 分)
查看原题目请点我这里解题思路 按照题目要求,逐个计算,需要注意的是判断某一类数是否不存在,一道简单的细节题。#include<cstdio>const int maxn=1010;int arr[maxn]={0};int main(){ int n,a1=0,a2=0,a3=0,a4=0,a5=-1,num,k=0;//a5是求最大值,所以初值一般赋为最小...原创 2018-03-16 11:16:21 · 212 阅读 · 0 评论 -
1015 德才论 (25 分)
题目描述 宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。” 现给出一批考生的德才分数,请根据司马光的理论给出录取排名。输入描述: 输入第1行给出3个正整数,分别为:N(=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格被考虑录取;H原创 2016-02-23 21:51:48 · 1923 阅读 · 0 评论 -
1016 部分A+B (15 分)
题目描述: 正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。现给定A、DA、B、DB,请编写程序计算PA + PB。输入格式:输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 输出格式:在一行中输出PA + PB的值。输入样例1: 386原创 2018-01-15 15:23:18 · 281 阅读 · 0 评论 -
1017 A除以B (20 分)
java大数值题目链接import java.util.*;import java.math.*;public class AdivideB { public static void main(String[] args) { Scanner in = new Scanner(System.in); BigInteger a = in.nextBigInteger(); B...原创 2019-07-11 16:31:42 · 164 阅读 · 1 评论 -
1018 锤子剪刀布 (20 分)
解题思路 计算甲乙两者的胜负,相当于零和博弈,甲赢了乙肯定输了,所以记录甲就行了,乙的胜负与之相反。 注意 最后需要输出获胜次数最多的手势,我开始是用数组记录,将获胜的手势字符转变为ASCII对应的数值存在数组中,然后从数组中找出最大值,最后用char输出该结果,但~是~没通过。我觉得逻辑上没问题,后来我实在没办法了,只能搞了个map通过了。#include<cstdio>...原创 2018-03-16 12:03:26 · 184 阅读 · 0 评论 -
1019 数字黑洞 (20 分)
查看原题目请点我解题思路:主要是将数字每位拆分后放在数组上,然后对数组进行升序和降序排列,再将数组中的数字计算出来,最后判断是6174或者0不再循环。还有一些细节方面的问题,如果写代码的时候注意到,就可以直接得满分,而不用纠结某个测试点一直过去,其实有时候就是习惯问题,比如声明变量时顺便赋值为0,还有数组每次计算完后要置0等等。#include&lt;cstdio&gt;#include...原创 2018-03-15 18:39:37 · 331 阅读 · 0 评论 -
1020 月饼 (25 分)
查看原题目请点我这里 解题思路:这是入门级的贪心算法,涉及结构体排序,需要注意的是尽量统一数据类型,不然特别烦。我第三个测试点搞了很久,但是我看了别人的代码,发现我的逻辑上丝毫没有问题,最后终于发现了,原来是结构体中一部分用的int,还有一部分用的double,两者进行比较的时候就出现了问题。#include<cstdio>#include<algorithm>...原创 2018-03-15 18:06:47 · 210 阅读 · 0 评论 -
1023 组个最小数 (20 分)
查看原题目请点我 C/C++版#include<cstdio>int arr[12]={0};int main(){ for(int i=0;i<10;i++){ scanf("%d",&arr[i]); } for(int i=1;i<10;i++){ if(arr[i]!=0){ ...原创 2018-03-14 18:50:37 · 192 阅读 · 0 评论 -
1027 打印沙漏 (20 分)
打印沙漏以后再也不用为这种题恐惧了,真的恶习!只需要输出沙漏前半部分的空格,后半部分没必要。找到规律,先把空格打印完,然后打印字符,最后打印换行符。#include<cstdio>#include<cmath>int main(){ int n; char c; scanf("%d %c",&n,&c); int r = sqrt((n+...原创 2019-07-15 16:03:16 · 145 阅读 · 0 评论 -
1028 人口普查 (20 分)
查看原题目请点我这里解题思路 首先把合理的人员加入结构体中,在加入的时候顺便统计一下有多少个人,然后对结构体中合格的人员按照出生日期进行排序,得到最年长的在第一位,最年轻的在最后一位,直接输出就行了。是否是合理的人员通过check函数判断。 注意 当没有合格的人员时,直接输出0就行了。#include<cstdio>#include<algorithm>#...原创 2018-03-15 19:33:54 · 199 阅读 · 0 评论 -
1029 旧键盘 (20 分)
查看原题目请点我 解题思路:本题还是比较简单的,主要是对字符串的处理,利用hash识别是否输出过,对于大小写字母任意一个出现,就代表该键已坏,所以后续该键不必输出。#include<cstdio>#include<cstring>int main(){ char in[100],out[100]; scanf("%s%s",in,out); ...原创 2018-03-13 11:46:23 · 201 阅读 · 0 评论 -
1031 查验身份证 (15 分)
查看原题目请点我 解题思路:这里先要检查是否前17位都为数字,然后将前17位的数字加权对11取模,然后进行明码翻译,如果对应正确就是合格的身份证号码。#include<cstdio>#include<cstring>int weight[]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};int M[]={1,0,11,9,8,7...原创 2018-03-14 18:27:41 · 326 阅读 · 0 评论 -
1034 有理数四则运算 (20 分)
模板#include<bits/stdc++.h>using namespace std;typedef long long ll;struct Fraction{ ll up,down;};Fraction f1,f2;ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}Fraction reduction(Fraction...原创 2019-01-28 16:28:42 · 352 阅读 · 0 评论 -
1035 插入与归并 (25 分)
主要考查对插入排序和对归并排序的掌握插入排序注意需要对A[i]设置一个中间变量保存,否则会被覆盖,反正我经常忘记。归并排序我经常对两个排好序的链表和数组归并,但是很少对整个数组从头归并。所以最好记个模板。void mergeSort(int A[]){ for(int step=2;step/2 < n;step=step*2){ for(int i=0;i<n;i+=s...原创 2019-01-23 18:47:07 · 398 阅读 · 0 评论 -
1036 跟奥巴马一起编程 (15 分)
查看原题目请点我这里 解题思路 需要注意的是题目说的时四舍五入,所以应该是向上取整除完加1,或者加一以后再除都是正确的。#include<cstdio>int main(){ int n; char ch; scanf("%d %c",&n,&ch); int t=(n+1)/2; for(int i=0;i&l...原创 2018-03-16 18:53:19 · 199 阅读 · 0 评论 -
1038 统计同成绩学生 (20 分)
查看原题目请点我 解题思路:这是一道超级简单的题,散列就完事了!#include<cstdio>int Hash[100]={0};int main(){ int N,num,K; scanf("%d",&N); for(int i=0;i<N;i++){ scanf("%d",&num); ...原创 2018-03-13 12:06:05 · 197 阅读 · 0 评论 -
1039 到底买不买 (20 分)
查看原题目请点我这里 解题思路 主要是散列,其次是对比将不足的记为负数。#include<cstdio>#include<cstring>const int maxn=1005;int arr[80]={0};int main(){ char str[maxn],stt[maxn]; scanf("%s%s",str,stt); ...原创 2018-03-16 22:03:34 · 393 阅读 · 0 评论