pat甲级考试+pat1051+1056
- 2022 年 8 月 7 日
- 筆記
- pat甲级(Advanced Level)刷题记录
同上一篇博客;
贪心题目我已经刷了将近30道了,由于那几天考驾照就没写,以后有空的时候补过来吧,都在codeblock里
pat的题也刷了点,acwing 的题也刷了点,基本都攒下了。以后也会慢慢补过来的
这几天都在备战四级,上午司机下午算法,有点忙不过来就一直没写博客,今天打完比赛就想趁热写一下吧,正好昨天也做了22年夏的甲级考试
来说说pat甲级:
第一次做pat甲级考试真题感受,一共4道题须在3个小时内做完,我感觉这真的是时间很充裕了
同时四道题的难度可能也是逐级拉开的,通常甲级前两道题是可以A出来的,对于高手们来讲满分直接轻轻松松,但是或许我甲级题库刷的还不少很多并且很多算法和数据结构有点手生了,就比如二叉树和图论的一些算法就不太会写了。。。。。甚至第三道题建立邻接表的时候我都在想邻接表是怎么写来着???
所以说第一次做就只做了前两道
在经过和队友的讨论和算法构思上把第三道自己不会的题目也是顺利切了,最后一道题是考的完全多叉树的遍历,由于树的知识点还没有开始全面复习就只能等刷完list之后在补了
题目大意:两小儿争辩日期,A小儿和B小儿分别说了三个日期:y(昨天),td(今天),tom(明天,哟,这不快明天了吗),并且这两个小儿说的话每人只有一句真话,确认今天的同时输出today并且输出那两句话为真并且输出他们是y or td or tom;
题目思路:他们两个人每人只有一句话为真,所以我们只要是标记他们的话与1~7的匹配,如果他们匹配次数都是1,就说明他们的话不仅连了起来并且那两句话是真话,
打的string表在标记后输出就可以了;
1 #include<bits/stdc++.h>//2022 pat 甲级1 2 using namespace std; 3 #define int long long 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); 5 int a,b,c; 6 int d,e,f; 7 int yes[10]={6,0,1,2,3,4,5}; 8 int fut[10]={1,2,3,4,5,6,0}; 9 string day[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; 10 int cur1; 11 int cur2; 12 int flag1; 13 int flag2; 14 string t[7]={"yesterday","today","tomorrow"}; 15 signed main() 16 { 17 IOS; 18 cin>>a>>b>>c>>d>>e>>f; 19 for(int i=0;i<7;i++) 20 { 21 int cur1=0,cur2=0; 22 int flag1=0,flag2=0; 23 if(a==yes[i]) 24 { 25 cur1++; 26 flag1=0; 27 } 28 if(b==i) 29 { 30 cur1++; 31 flag1=1; 32 } 33 if(c==fut[i]) 34 { 35 cur1++; 36 flag1=2; 37 } 38 if(d==yes[i]) 39 { 40 cur2++; 41 flag2=0; 42 } 43 if(e==i) 44 { 45 cur2++; 46 flag2=1; 47 } 48 if(f==fut[i]) 49 { 50 cur2++; 51 flag2=2; 52 } 53 if(cur1==1&&cur2==1) 54 { 55 cout<<day[i]<<endl; 56 cout<<t[flag1]<<endl; 57 cout<<t[flag2]; 58 return 0; 59 } 60 } 61 return 0; 62 }
题目大意:模拟LRU算法,所谓的LRU算法就是访问页面次数最小的网页会在进来新网页的时候被kick off
面向样例:
6,
可以这样来看(其实上图已经很明确了….)
4 11
1 2 3 1 4 5 2 1 5 6 3
先进来的是1,2,3,1四个网页,并且当前网页1的访问次数是2,所以说当前网页2是LRU状态,在进来网页4,达到满值n,再进来网页5,网页2是LRU状态被开,再进来网页2,网页3是LRU状态被开,再进来网页1,网页4是LRU状态被开并且网页1的访问次数是3,在5,6,3……..
那怎么来写代码呢
首先直观感受是用queue了,并且还有一个数组来记录被开的网页和记录网页访问次数的数组,所以说可以酱紫分析:
首先是将每个网页入队,如果没有达到满值状态就记入队并且记录网页访问次数,同时未被访问的网页入队的时候计数器也要加一;
当计数器大于n时候也就是达到满值状态的时候,首先要考虑这个网页没有被访问过的情况
如果它没有被访问过,我们要找的肯定是下一个LRU状态就是按照次序删除访问页最少的网页,所以就每次取队头找最少访问网页,找到以后直接进入记录数组且出队并且减少访问次数(因为已经被弹出了)
参考代码:
1 #include<bits/stdc++.h>//2022 pat 甲级2 2 using namespace std; 3 #define int long long 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); 5 const int N=1e5+10; 6 //int a[N]; 7 //map<int,int>p; 8 int f[N]; 9 queue<int>p; 10 vector<int>q; 11 int n,m; 12 int cnt; 13 signed main() 14 { 15 IOS; 16 cin>>n>>m; 17 for(int i=0;i<m;i++) 18 { 19 int a; 20 cin>>a; 21 if(cnt<n) 22 { 23 p.push(a); 24 if(!f[a]) 25 cnt++; 26 f[a]++; 27 } 28 else 29 { 30 if(!f[a]) 31 { 32 while(f[p.front()]!=1) 33 { 34 f[p.front()]--; 35 p.pop(); 36 } 37 q.push_back(p.front()); 38 f[p.front()]--; 39 p.pop(); 40 } 41 p.push(a); 42 f[a]++; 43 } 44 } 45 for(int i=0;i<q.size();i++) 46 { 47 cout<<q[i]; 48 if(i<q.size()-1) 49 cout<<" "; 50 } 51 return 0; 52 }
题目思路:
没采用dfs一是因为怕爆栈,二是因为dfs在处理没有下一个地址的时候的回溯和对于重复走的点的处理有点麻烦了,就选择了模拟dfs
参考代码:
#include<bits/stdc++.h>//pat夏甲级3 using namespace std; #define int long long #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); const int N=1e4+10; vector<int>G[N]; int s[N]; bool vis[1010]; bool f[1010][1010]; int t[1010]; signed main() { IOS; int n,m,k; cin>>n>>m>>k; for(int i=0;i<m;i++) { int a,b; cin>>a>>b; f[a][b]=true; G[a].push_back(b); } while(k--) { memset(t,0,sizeof(t)); memset(vis,false,sizeof(vis)); for(int i=0;i<n;i++) { cin>>s[i]; t[s[i]]++; } bool flag1=true; for(int i=0;i<n;i++){ if(t[s[i]]!=1) flag1=false; } bool flag2=true; for(int i=0;i<n;i++) { int st=s[i]; int ed=s[i+1]; vis[st]=true; if(!f[st][ed]) { for(int j=0;j<G[st].size();j++) { int v=G[st][j]; if(!vis[v]) { flag2=false; } } } } if(flag1&&flag2) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
太困了太困了,有些细节没写,明天再写吧,困死我了