2022年夏季pat考试题解(题面凭记忆)
第一题(20分)题意:两个小孩每人关于日期说三句话,只有一句是真的,判断今天的日期。
简单枚举即可
第二题(25分)题意:有一个缓冲区(不知道翻译的对不对),容量固定,每次放入一个元素,如果缓冲区中有相同元素
就更新,如果超出容量就弹出过期的元素。求弹出的元素序列。
维护两个数组,缓冲区a和缓冲区内元素的下标pos,模拟整个过程。
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int a[N],idx=0,asize=0,hh=0;
unordered_map<int,int> pos;
vector<int> ans;
int main(){
int n,m,x;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x;
if(pos[x]){
a[pos[x]]=0;
a[++idx]=x;
pos[x]=idx;
}
else if(asize<n){
a[++idx]=x;
pos[x]=idx;
asize++;
}
else{
while(!a[hh]) hh++;
ans.push_back(a[hh]);
pos[a[hh]]=0;
a[hh]=0;
hh++;
a[++idx]=x;
pos[x]=idx;
}
}
cout<<ans[0];
for(int i=1;i<ans.size();i++) cout<<" "<<ans[i];
return 0;
}
第三题(25分)题意:给定一个有向图和若干个序列,依次判断每个序列是不是对这个有向图dfs的结果并且每个点只访问一次。
数据较小可以用邻接矩阵存图。因为起点可以是任意点,所以可能需要多次dfs才能遍历完所有点
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
int n;
int g[N][N];
int path[N];
bool st[N];
bool dfs(int s){
if(path[s]>n) return false;
if(s==n) return true;
int x=path[s];
st[x]=1;
int y=path[s+1];
if(g[x][y]!=1){
for(int i=1;i<=n;i++){
if(!st[i] && g[x][i]==1) return false;
}
return dfs(s+1);
}
if(g[x][y]==1 && st[y]) return false;
return dfs(s+1);
}
int main(){
int m,q;
cin>>n>>m>>q;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
g[x][y]=1;
}
while(q--){
memset(st,0,sizeof st);
for(int i=1;i<=n;i++) cin>>path[i];
if(dfs(1)) puts("yes");
else puts("no");
}
return 0;
}
第四题(30分)题意:给定一个完全多叉树的前序遍历和一系列访问,求它的层序遍历和每次访问的点到根节点的路径
可能是二叉树已经考烂了,所以换成了多叉树……其实做法都一样
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 1010;
int p;
int n,d;
int pre[N],level[N];
void build(int x){
level[x]=pre[p++];
for(int i=1;i<=d;i++){
if(x*d+i<n) build(x*d+i);
else break;
}
}
void print(){
cout<<level[0];
for(int i=1;i<n;i++) cout<<" "<<level[i];
cout<<endl;
}
void print_path(int x){
int s=x;
cout<<level[s];
s=(s-1)/d;
while(s){
cout<<" "<<level[s];
s=(s-1)/d;
}
if(x!=0) cout<<" "<<level[0];
}
int main(){
cin>>n>>d;
for(int i=0;i<n;i++) cin>>pre[i];
build(0);
print();
int k;
cin>>k;
while(k--){
int x;
cin>>x;
print_path(x);
cout<<endl;
}
return 0;
}
总结:看得出来自从取消对浙大考研的优惠后pat已经快凉了(这次只有不到400人考),但是题目质量还行,缺点就是有点贵hhh

浙公网安备 33010602011771号