1. 程式人生 > 其它 >2022年夏季pat考試題解(題面憑記憶)

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