PAT (甲级) 2022年秋季考试 c++ 满分题解

绝地灬酷狼 2023-09-24 15:03 162阅读 0赞

PAT (甲级) 2022年秋季考试 c++ 满分题解

7-1 Balloon Popping

分数 20

原题

在这里插入图片描述
在这里插入图片描述

算法标签

模拟 枚举

思路

枚举数组元素, 判断每个元素覆盖气球数, 记录最多可覆盖气球数及最多可覆盖气球数开始下标, 则最小开始值为最后可覆盖气球位置减高度H

代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define rep(i, a, b) for(int i=a; i<b; ++i)
  6. #define Rep(i, a, b) for(int i=a; i>b; --i)
  7. #define x first
  8. #define y second
  9. #define ump unorderer_map
  10. #define pq priority_queue
  11. #define debug(a) cout<<"a = "<<a<<"\n"
  12. #define debugi(a) printf("a = %lld\n", a)
  13. using namespace std;
  14. int n,m, mx=0, mn=1000, MX=1, MXID=0;
  15. int a[100005];
  16. inline int rd(){
  17. int s=0, w=1;
  18. char ch=getchar();
  19. while(ch<'0'||ch>'9'){
  20. if(ch=='-'){
  21. w=-1;
  22. }
  23. ch=getchar();
  24. }
  25. while(ch>='0'&&ch<='9'){
  26. s=s*10+ch-'0';
  27. ch=getchar();
  28. }
  29. return s*w;
  30. }
  31. signed main(){
  32. ios::sync_with_stdio(false);
  33. cin.tie(0);
  34. cout.tie(0);
  35. n=rd(), m=rd();
  36. rep(i, 0, n){
  37. a[i]=rd();
  38. mn=min(a[i], mn);
  39. mx=max(a[i], mx);
  40. }
  41. rep(i, 0, n){
  42. int cnt=1;
  43. while(a[i]+m>=a[i+cnt]&&i+cnt<n){
  44. cnt++;
  45. }
  46. if(cnt>MX){
  47. MX=cnt;
  48. MXID=i;
  49. }
  50. }
  51. if(MXID==a[0]){
  52. printf("%lld %lld\n", MXID, MX);
  53. }else if(MXID!=a[0]){
  54. printf("%lld %lld\n", a[MXID+MX-1]-m, MX);
  55. }
  56. return 0;
  57. }

7-2 The Second Run of Quicksort

分数 25

原题

在这里插入图片描述
在这里插入图片描述

算法标签

DP 排序

思路

具体思路见第八章 动态规划 5 AcWing 1591. 快速排序
值得注意的是, 如何通过临界值的数量对结果判断,可分为以下情况
第一轮临界值为a[0](或a[N]) 第一轮临界值为a[N](或a[0]) 临界值的数量2 属于第二轮排序
第一轮临界值为a[0](或a[N]) 第一轮临界值为a[i](i>0且i<0) 临界值的数量2 属于第二轮排序
若不属于上述情况 临界值的数量3 属于第二轮排序
否则 不属于第二轮排序

代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define x first
  6. #define y second
  7. #define ump unordered_map
  8. #define ums unordered_set
  9. #define pq priority_queue
  10. #define rep(i, a, b) for(int i=a;i<b;++i)
  11. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  12. using namespace std;
  13. typedef pair<int, int> PII;
  14. const int N=100005, INF=0x3f3f3f3f3f3f3f3f, MOD=1e9+7;
  15. const double Exp=1e-8;
  16. //int t, n, m, cnt, ans;
  17. int n, l[N], r[N], a[N];
  18. inline int rd(){
  19. int s=0,w=1;
  20. char ch=getchar();
  21. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  22. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  23. return s*w;
  24. }
  25. void put(int x) {
  26. if(x<0) putchar('-'),x=-x;
  27. if(x>=10) put(x/10);
  28. putchar(x%10^48);
  29. }
  30. signed main(){
  31. ios::sync_with_stdio(false);
  32. cin.tie(0);
  33. cout.tie(0);
  34. int t=rd();
  35. while(t--){
  36. bool flagh=false, flagt=false;
  37. vector<int> res;
  38. n=rd();
  39. rep(i, 1, n+1){
  40. a[i]=rd();
  41. }
  42. rep(i, 1, n+1){
  43. l[i]=max(l[i-1], a[i]);
  44. }
  45. r[n+1]=INF;
  46. Rep(i, n, 0){
  47. r[i]=min(r[i+1], a[i]);
  48. }
  49. rep(i, 1, n+1){
  50. if(a[i]>l[i-1]&&a[i]<r[i+1]){
  51. if(i==1){
  52. flagh=true;
  53. }
  54. if(i==n){
  55. flagt=true;
  56. }
  57. res.push_back(a[i]);
  58. }
  59. }
  60. if(flagh&&flagt||flagh&&res.size()==2||flagt&&res.size()==2||res.size()==3){
  61. puts("Yes");
  62. }else{
  63. puts("No");
  64. }
  65. }
  66. return 0;
  67. }

7-3 Leader of the Opinion Leaders

分数 25

原题

在这里插入图片描述

算法标签

图 模拟

思路

依题意模拟, 具体思路见代码

代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pb push_back
  10. #define pq priority_queue
  11. #define rep(i, a, b) for(int i=a;i<b;++i)
  12. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  13. using namespace std;
  14. const int N = 10005, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  15. const double Exp=1e-8;
  16. // in[i] 关注用户i的人 out[i]用户i关注的人
  17. vector<int> in[N], out[N], res;
  18. bool st[N];
  19. inline int rd(){
  20. int s=0,w=1;
  21. char ch=getchar();
  22. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  23. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  24. return s*w;
  25. }
  26. void put(int x) {
  27. if(x<0) putchar('-'),x=-x;
  28. if(x>=10) put(x/10);
  29. putchar(x%10^48);
  30. }
  31. signed main(){
  32. ios::sync_with_stdio(false);
  33. cin.tie(0);
  34. cout.tie(0);
  35. int n=rd(), t=rd();
  36. rep(i, 1, n+1){
  37. int x=rd();
  38. while(x--){
  39. int y=rd();
  40. in[y].pb(i);
  41. out[i].pb(y);
  42. }
  43. }
  44. // 标记精神领袖
  45. rep(i, 1, n+1){
  46. if(in[i].size()>=out[i].size()*t){
  47. st[i]=true;
  48. }
  49. }
  50. int mx=0;
  51. rep(i, 1, n+1){
  52. int m=0;
  53. // 统计粉丝数
  54. rep(j, 0, in[i].size()){
  55. if(st[in[i][j]]){
  56. m++;
  57. }
  58. }
  59. if(st[i]){
  60. // 更新最大粉丝数 清空原领袖
  61. if(m>mx){
  62. mx=m;
  63. res.clear();
  64. res.pb(i);
  65. }else if(m==mx){// 更新领袖
  66. res.pb(i);
  67. }
  68. }
  69. }
  70. printf("%lld", res[0]);
  71. rep(i, 1, res.size()){
  72. printf(" %lld", res[i]);
  73. }
  74. return 0;
  75. }

7-4 Pseudo-completeness

分数 30

原题

在这里插入图片描述
在这里插入图片描述

算法标签

树 dfs 模拟

思路

po[]存储后序遍历序列,d为层序遍历从左到右的序号(从0开始),f标记当前序号有无结点,mx为最大深度;
从前往后遍历第一个未被标记的节点序号:
①为n,且结点数量为2的n次方减1,则为perfect binary tree;
②为n,且结点数量不为2的n次方减1,则为complete binary tree;
③不为n,且在mx减1层的结点之后,则为pseudo-complete binary tree。

代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pb push_back
  10. #define pq priority_queue
  11. #define rep(i, a, b) for(int i=a;i<b;++i)
  12. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  13. using namespace std;
  14. const int N = 10005, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  15. const double Exp=1e-8;
  16. int pre[N], in[N], po[N], f[N];
  17. bool st[N];
  18. int mx, p;
  19. inline int rd(){
  20. int s=0,w=1;
  21. char ch=getchar();
  22. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  23. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  24. return s*w;
  25. }
  26. void put(int x) {
  27. if(x<0) putchar('-'),x=-x;
  28. if(x>=10) put(x/10);
  29. putchar(x%10^48);
  30. }
  31. void dfs(int u, int l, int r, int d, int le){
  32. if(l>r){
  33. return;
  34. }
  35. f[d]=true;
  36. mx=max(mx, le);
  37. int t=l;
  38. while(pre[u]!=in[t]){
  39. t++;
  40. }
  41. dfs(u+1, l, t-1, d*2+1, le+1);
  42. dfs(u+1+(t-l), t+1, r, d*2+2, le+1);
  43. po[p++]=pre[u];
  44. }
  45. signed main(){
  46. ios::sync_with_stdio(false);
  47. cin.tie(0);
  48. cout.tie(0);
  49. int n=rd();
  50. rep(i, 1, n+1){
  51. in[i]=rd();
  52. }
  53. rep(i, 1, n+1){
  54. pre[i]=rd();
  55. }
  56. dfs(1, 1, n, 0, 1);
  57. rep(i, 0, n+1){
  58. if(!f[i]){
  59. if(i==n&&log2(n+1)==(int)log2(n+1)){
  60. puts("1");
  61. }else if(i==n){
  62. puts("2");
  63. }else if(i>=pow(2, mx-1)){
  64. puts("3");
  65. }else{
  66. puts("0");
  67. }
  68. break;
  69. }
  70. }
  71. printf("%lld", po[0]);
  72. rep(i, 1, n){
  73. printf(" %lld", po[i]);
  74. }
  75. return 0;
  76. }

参考文献

【PAT乙级+甲级题解】2022年秋季PAT乙级+甲级题解 By小柳 2022-9-4 19:00

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,162人围观)

还没有评论,来说两句吧...

相关阅读