写一次题解,是2021PAT甲级春季的真题,我今年考过,但是不是很理想,做到第三题,实在不会堆排序,直接交卷了,真是很遗憾。后来状态一直不是很好,买了acwing的网课,看了一段时间,yxc真的很强,代码老练沉稳简洁。我一直偷懒用STL的,人家大佬一直手写,但还是比代码便秘的我,更短更强。
今天回顾一下,九月再考一次吧。

题意
求一个size为n的素数等差数列,最大上边界为maxp,如果有多个,则取公差最大的,如果还有多个,取首项最大的.找不到就输出范围内最大素数。
思路
用线性筛或者埃筛打一个素数表,降低一下遍历的复杂度。
然后从大到小枚举MAXP范围内的所有的素数。
等差从大到小枚举,如果能组成完整素数列,则更新我的数据,更新的唯一标准就是新素数列的公差比我更大,因为我已经保证了首项是从大到小的。
d≤MAXP−a/n−1,对n=1,特判一下,防止除零异常。

//
// Created by 江左 on 2021/8/18.
//#include <iostream>
#include <vector>
const int N=100010;
using namespace std;
int n,p,dmax=-1,res;vector<int> primes; //记忆下,范围内的素数
bool st[N];         // st[x]存储x是否被筛掉void get_primes(int n)
{for (int i = 2; i <= n; i ++ ){if (!st[i]) primes.push_back(i);for (int j = 0; primes[j] <= n / i; j ++ ){st[primes[j] * i] = true;if (i % primes[j] == 0) break;}}
}
int main()
{scanf("%d %d",&n,&p);get_primes(p);if(n==1) {cout<<primes.back();return 0;}for(int i=primes.size()-1;i>=0;i--){int a=primes[i];//首项for (int d = (p-a)/(n-1); d >=1 ; --d) { //d是公差bool f= true;int cnt=n-1,t=a;while(cnt--){t+=d;if(st[t])//a[i]需要{f=false;break;}}if(f){if(d>dmax) dmax=d,res=a;break;}}}if(dmax==-1) cout<<primes.back();else{for (int i = res,cnt=0; cnt < n; ++cnt,i+=dmax) {if(cnt!=0) printf(" ");printf("%d",i);}}
}

题意:
同意时间段里,别让两个人同时进入,为了防止新冠。问一天内最大访问量。
思路
贪心,根据离开时间从小到大排序,下一个人和我冲突就跳过,除非进入时间,大于我的离开时间,和我不冲突,我就更新信息。
技巧
把时间化成秒,秒数小的一定早。
使用pair<离开,进入>(pair,根据first排序,所以离开写在左边)。然后一个sort解决。yxc ,YYDS。
pair实属好用,谁用谁知道。

//
// Created by 江左 on 2021/8/19.
//#include <iostream>
#include <algorithm>
using namespace std;
const int N=2010;
typedef pair<int,int> PII;
PII arr[N];
int n,a,b,c,r,l,idx,cnt;
int main()
{scanf("%d",&n);for (int i = 0; i < n; ++i) {scanf("%d:%d:%d",&a,&b,&c);l=a*3600+b*60+c;scanf("%d:%d:%d",&a,&b,&c);r=a*3600+b*60+c;arr[idx++]={r,l};}sort(arr,arr+n);int minR=arr[0].first;cnt++;for (int i = 1; i < n; ++i) {if(arr[i].second>= minR){minR=arr[i].first;cnt++;}}cout<<cnt;return 0;
}


题意:
给你序列,构建大根堆,判断m次说法对不对。
思路
插入一个节点调整一次。
insert操作一次up操作一次。
技巧
sscanf的使用
根节点的下标是1,互为邻居的下标/2相同,左孩子下标是父下标2,右孩子是2+1;

//
// Created by 江左 on 2021/8/19.
//
#include <iostream>
#include <map>
#include <string>
using namespace std;
const int N=1010;
int h[N],cnt=1;
int n,m;
int t,t1,t2,value;
string s;
map<int,int> mm; //调整完毕后,值和下标的映射.
void up(int u)
{while (u/2&&h[u]>h[u/2]){swap(h[u],h[u/2]);u>>=1;}
}
void insert(int x)
{h[cnt]=x;up(cnt);cnt++;
}int main()
{scanf("%d %d",&n,&m);for (int i = 0; i < n; ++i) {scanf("%d",&t);insert(t);}for (int i = 1; i <= n; ++i ) mm[h[i]]=i; //整理映射getchar();while(m--){getline(cin,s);if (s.back() == 't') {sscanf(s.c_str(), "%d is the root", &value);printf("%d",h[1]==value?1:0);} else if (s.back() == 's') {sscanf(s.c_str(), "%d and %d are siblings", &t1, &t2);printf("%d",mm[t1]/2==mm[t2]/2?1:0);} else if (s.find("parent") < s.length()) {sscanf(s.c_str(), "%d is the parent of %d", &t1, &t2);printf("%d",mm[t1]==mm[t2]/2?1:0);} else if (s.find("left") < s.length()) {sscanf(s.c_str(), "%d is the left child of %d", &t1, &t2);printf("%d",mm[t1]==mm[t2]*2?1:0);} else {sscanf(s.c_str(), "%d is the right child of %d", &t1, &t2);printf("%d",mm[t1]==mm[t2]*2+1?1:0);}}return 0;
}

题意:
从0出发去回收小车,回收的贪心策略是,找最近的,有一样近的,就找下标小的,然后打印 回收顺序和总长度。
如果有离散的点,(到不了的点),就把他们也从小到大打印一遍。
思路
floyd算法,O(n^3) 解决多源点问题,找到每对(i,j)的最短路径。
每一次只要枚举找当前点,能到达的最近的点(没被访问过)。
技巧

//
// Created by 江左 on 2021/8/19.
//#include <iostream>
#include <algorithm>
#include <vector>using namespace std;
const int N=210;
const int INF= 1e9;
int d[N][N];
int n,m,a,b,c,res;
bool st[N];void floyd()
{for (int k = 0; k <= n; k ++ )for (int i = 0; i <= n; i ++ )for (int j = 0; j <= n; j ++ )d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
int main() {scanf("%d %d",&n,&m);for (int i = 0; i <= n; i ++ )for (int j = 0; j <= n; j ++ )d[i][j] = INF;while (m--){scanf("%d %d %d",&a,&b,&c);d[a][b]=d[b][a]=c;}floyd();int begin=0,next;//起始出发点,和下一个路径最短,下标最小的点vector<int> v;v.push_back(begin);st[0]=true;while (1) {int minD=INF;for (int j = 0; j <= n; ++j) {if(!st[j]&&d[begin][j]<minD) {minD = d[begin][j],next = j;}}if(minD==INF)//没法找全了{for (auto e:v)printf("%d%c",e,e==v.back()?'\n':' ');bool f=true;for (int i=0;i<=n;i++)if(!st[i]) {if(f){printf("%d",i);f=false;}else{printf(" %d",i);}}break;}else{res+=d[begin][next];st[next]=true;v.push_back(next);begin=next;if(v.size()==n+1){for (auto e:v)printf("%d%c",e,e==v.back()?'\n':' ');cout<<res;break;}}}return 0;
}

总结
编号 标题 分数 类型
7-1 Arithmetic Progression of Primes 20 5.4 素数
7-2 Lab Access Scheduling 25 4.4 贪心
7-3 Structure of Max-Heap 25 9.7 堆
7-4 Recycling of Shared Bicycles 30 10.4 最短路径

今天还是很顺写出来了,但是我知道考场上我肯定不行,呜呜。

2021PAT甲级春季考试题解 AC相关推荐

  1. 2020年PAT甲级春季考试真题及答案

    1168 Prime Day The above picture is from Sina Weibo, showing May 23rd, 2019 as a very cool "Pri ...

  2. PAT-2022年春季考试 - 甲级题解

    试卷在此 7-1 Simple Lie Detection (20 分) 作者 陈越 单位 浙江大学 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB Lie detection ...

  3. PAT-2021年春季考试-甲级

    ** PAT-2021年春季考试-甲级 7-3 structure of max-heap ** 对我个人来说,这道题的难点在于没能利用sscanf 以及 cin.get() 函数进行提问内容的读取 ...

  4. [NJUST]19级上机考试题解

    [NJUST]19级上机考试题解 (先赞后看,已成习惯) 上机考试结束了,成绩也出来了,大家有没有考到500分吖 ,我整理了一些同学的满分代码,以及我对题目的一些个人理解. A 日历题 题意: 输入 ...

  5. 【PAT甲级最新题解】PAT甲级2020.7月春季考试满分题解(附代码)

    写在前面:这次题目虽然大多数是模拟题且不算难,但是题面其实不算友好,不少同学因为题目描述而错失满分. A: 题意:给定一个数字串,问每一个前缀串是否是素数. 模拟题不多解释. #include< ...

  6. pat甲级考试报名费_PAT(甲级)2019年冬季考试 题解

    总结写在前头: 考了字符串.链表(伪链表).图.树.考点比较均衡. 本次考试难度还行,需要较扎实的数据结构底子,对于字符串处理的技巧有一定的要求. 说句题外话,字符串是个重点,主要因为很多人会忽视字符 ...

  7. PAT(甲级)2020年春季考试 7-4 Replacement Selection

    这种复杂的模拟题,对于我这种菜鸡,只能是根据自己的理解,去把题目给演示出来,然后结合测试用例,一点一点debug+打印输出,的确耗时,所以考试要是遇到就放最后吧. 把这题做出来,我的一个收获是,学会了 ...

  8. PAT(甲级)2019年春季考试 7-2 Anniversary

    注意点 1. 记录是不是校友,有两种方法 (1)map<string,int> mp   +   mo[guest] = 1  +  判断mp[comer] (2)set<strin ...

  9. PAT(甲级)2019年春季考试 7-3 Telefraud Detection

    1. 这题复杂在诈骗检测算法的理解 怎样的一个人会被判定成嫌疑犯呢? 他打出给别人的累计通话时长的不同的人数大于K 注意:不同和累计 怎样的两个人会被判定成同伙呢? 相互之间有通话记录 2. 同伙的合 ...

最新文章

  1. 【JVM】浅谈双亲委派和破坏双亲委派
  2. 分享一个基于jQuery,backbone.js和underscore.js的消息提示框架 - Backbone.Notifier
  3. 匿名内部类----java
  4. “锤死挣扎”的骁龙845+128GB旗舰机暴降1500元 仍冷清!
  5. 风控中的企业与个人数据有哪些核验维度
  6. 1.[精通Hibernate笔记]Hibernate简介
  7. c++中的向量_C ++中的向量
  8. 增值税防伪税控系统到底是什么呢?
  9. 好东西都在这里,不点下看看吗(博客目录导航,持续更新中...)
  10. 易打卡模板微信签到打卡小程序源码
  11. 服务器装凤凰系统,云服务器安装凤凰os
  12. maven [INFO] No proxies configured [INFO] No proxy was configured, downloading directly
  13. 80后 程序猿 单恋10年,是一种怎样的体验?
  14. 图片实现裁剪功能vue-img-cutter
  15. GPU显存占满但利用率却很低
  16. Python数据分析案例17——电影人气预测(特征工程构建)
  17. css中vh/vw与%的区别
  18. 博客右下角的动态人物(live2d)看板娘
  19. UI控件之开关按钮(ToggleButton与Switch)
  20. 1024程序员节,我被喷上了热搜!

热门文章

  1. Fabfilter 促销 - 顶尖的压缩、多段压缩、混响器
  2. C语言实现进度条彩色变化
  3. 触发你的生活:IFTTT
  4. 企业要做大做强,关键在于人才
  5. NBA总冠军之路~~~~
  6. 29Vue - 列表渲染(Template v-for)
  7. java遍历List数据的三种写法
  8. Datawhale第23期组队学习—深度学习推荐系统—task5 DIN
  9. 《思考,快与慢》思维导图
  10. The Definitive Guide to ARM Cortex M3 and Cortex M4 Processors, 3rd Edition.pdf