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

posted @ 2022-06-05 17:00  xhy666  阅读(292)  评论(0)    收藏  举报