2022年夏季pat考試題解(題面憑記憶)
阿新 • • 發佈:2022-06-05
第一題(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